134 changed files with 1493 additions and 1724 deletions
@ -0,0 +1,88 @@ |
|||
package io.sc.engine.rule.core; |
|||
|
|||
import io.sc.engine.rule.core.enums.HttpAuthorizationType; |
|||
import io.sc.engine.rule.core.enums.HttpMethodType; |
|||
|
|||
public class WebRequest { |
|||
private HttpMethodType httpMethod; |
|||
private String httpUrl; |
|||
private HttpAuthorizationType httpAuthType; |
|||
private String httpAuthApikey; |
|||
private String httpAuthApiValue; |
|||
private String httpAuthBasicUsername; |
|||
private String httpAuthBasicPassword; |
|||
private String httpAuthBearerToken; |
|||
private String httpRequestBody; |
|||
|
|||
public HttpMethodType getHttpMethod() { |
|||
return httpMethod; |
|||
} |
|||
|
|||
public void setHttpMethod(HttpMethodType httpMethod) { |
|||
this.httpMethod = httpMethod; |
|||
} |
|||
|
|||
public String getHttpUrl() { |
|||
return httpUrl; |
|||
} |
|||
|
|||
public void setHttpUrl(String httpUrl) { |
|||
this.httpUrl = httpUrl; |
|||
} |
|||
|
|||
public HttpAuthorizationType getHttpAuthType() { |
|||
return httpAuthType; |
|||
} |
|||
|
|||
public void setHttpAuthType(HttpAuthorizationType httpAuthType) { |
|||
this.httpAuthType = httpAuthType; |
|||
} |
|||
|
|||
public String getHttpAuthApikey() { |
|||
return httpAuthApikey; |
|||
} |
|||
|
|||
public void setHttpAuthApikey(String httpAuthApikey) { |
|||
this.httpAuthApikey = httpAuthApikey; |
|||
} |
|||
|
|||
public String getHttpAuthApiValue() { |
|||
return httpAuthApiValue; |
|||
} |
|||
|
|||
public void setHttpAuthApiValue(String httpAuthApiValue) { |
|||
this.httpAuthApiValue = httpAuthApiValue; |
|||
} |
|||
|
|||
public String getHttpAuthBasicUsername() { |
|||
return httpAuthBasicUsername; |
|||
} |
|||
|
|||
public void setHttpAuthBasicUsername(String httpAuthBasicUsername) { |
|||
this.httpAuthBasicUsername = httpAuthBasicUsername; |
|||
} |
|||
|
|||
public String getHttpAuthBasicPassword() { |
|||
return httpAuthBasicPassword; |
|||
} |
|||
|
|||
public void setHttpAuthBasicPassword(String httpAuthBasicPassword) { |
|||
this.httpAuthBasicPassword = httpAuthBasicPassword; |
|||
} |
|||
|
|||
public String getHttpAuthBearerToken() { |
|||
return httpAuthBearerToken; |
|||
} |
|||
|
|||
public void setHttpAuthBearerToken(String httpAuthBearerToken) { |
|||
this.httpAuthBearerToken = httpAuthBearerToken; |
|||
} |
|||
|
|||
public String getHttpRequestBody() { |
|||
return httpRequestBody; |
|||
} |
|||
|
|||
public void setHttpRequestBody(String httpRequestBody) { |
|||
this.httpRequestBody = httpRequestBody; |
|||
} |
|||
} |
@ -0,0 +1,40 @@ |
|||
package io.sc.engine.rule.core; |
|||
|
|||
public class WebResponse { |
|||
private boolean successful; |
|||
private int status; |
|||
private String error; |
|||
private String content; |
|||
|
|||
public boolean getSuccessful() { |
|||
return successful; |
|||
} |
|||
|
|||
public void setSuccessful(boolean successful) { |
|||
this.successful = successful; |
|||
} |
|||
|
|||
public int getStatus() { |
|||
return status; |
|||
} |
|||
|
|||
public void setStatus(int status) { |
|||
this.status = status; |
|||
} |
|||
|
|||
public String getError() { |
|||
return error; |
|||
} |
|||
|
|||
public void setError(String error) { |
|||
this.error = error; |
|||
} |
|||
|
|||
public String getContent() { |
|||
return content; |
|||
} |
|||
|
|||
public void setContent(String content) { |
|||
this.content = content; |
|||
} |
|||
} |
@ -0,0 +1,77 @@ |
|||
package io.sc.engine.rule.core.code.generator.impl.processor; |
|||
|
|||
import io.sc.engine.rule.core.enums.HttpAuthorizationType; |
|||
import io.sc.engine.rule.core.po.lib.Indicator; |
|||
import io.sc.engine.rule.core.po.lib.processor.HttpRequestIndicatorProcessor; |
|||
import io.sc.engine.rule.core.po.model.Parameter; |
|||
import io.sc.engine.rule.core.po.model.processor.HttpRequestParameterProcessor; |
|||
import io.sc.engine.rule.core.util.GroovyExpressionReplacer; |
|||
import io.sc.platform.util.StringUtil; |
|||
|
|||
public class HttpRequest { |
|||
public String groovy(Parameter parameter, HttpRequestParameterProcessor processor) throws Exception{ |
|||
if(parameter==null || processor==null){ return null; } |
|||
try { |
|||
StringBuilder sb =new StringBuilder(); |
|||
sb.append("{").append("\n"); |
|||
sb.append("\tio.sc.engine.rule.core.WebRequest request =new io.sc.engine.rule.core.WebRequest();\n"); |
|||
sb.append("\trequest.setHttpMethod(").append("io.sc.engine.rule.core.enums.HttpMethodType.").append(processor.getHttpMethod()).append(");\n"); |
|||
sb.append("\trequest.setHttpUrl(").append(StringUtil.format("${0}", GroovyExpressionReplacer.groovy(processor.getHttpUrl(),String.class.getName()))).append(");\n"); |
|||
if(processor.getHttpAuthType()!=null) { |
|||
sb.append("\trequest.setHttpAuthType(").append("io.sc.engine.rule.core.enums.HttpAuthorizationType.").append(processor.getHttpAuthType()).append(");\n"); |
|||
if(HttpAuthorizationType.BASIC_AUTH.equals(processor.getHttpAuthType())){ |
|||
sb.append("\trequest.setHttpAuthBasicUsername(").append(processor.getHttpAuthBasicUsername()).append(");\n"); |
|||
sb.append("\trequest.setHttpAuthBasicPassword(").append(processor.getHttpAuthBasicPassword()).append(");\n"); |
|||
}else if(HttpAuthorizationType.API_KEY.equals(processor.getHttpAuthType())){ |
|||
sb.append("\trequest.setHttpAuthApikey(").append(processor.getHttpAuthApikey()).append(");\n"); |
|||
sb.append("\trequest.setHttpAuthApiValue(").append(processor.getHttpAuthApiValue()).append(");\n"); |
|||
}else if(HttpAuthorizationType.BEARER.equals(processor.getHttpAuthType())){ |
|||
sb.append("\trequest.setHttpAuthBearerToken(").append(StringUtil.format("${0}", GroovyExpressionReplacer.groovy(processor.getHttpAuthBearerToken(),String.class.getName()))).append(");\n"); |
|||
} |
|||
}else{ |
|||
sb.append("\trequest.setHttpAuthType(").append("io.sc.engine.rule.core.enums.HttpAuthorizationType.NONE);\n"); |
|||
} |
|||
sb.append("\tio.sc.engine.rule.core.WebResponse response =io.sc.engine.rule.core.util.WebRequestUtil.sendWebRequest(request);\n"); |
|||
String groovy =StringUtil.tabs(processor.getHttpResponseMapping().replace("${response}","response"),1); |
|||
groovy =GroovyExpressionReplacer.groovy(groovy); |
|||
sb.append("\t").append(groovy).append("\n"); |
|||
sb.append("}").append("\n"); |
|||
return sb.toString(); |
|||
}catch(Exception e) { |
|||
throw new RuntimeException("There was a Error when generate " + parameter.getName()+ "'s HttpRequest groovy source code.", e); |
|||
} |
|||
} |
|||
|
|||
public String groovy(Indicator indicator, HttpRequestIndicatorProcessor processor) throws Exception{ |
|||
if(indicator==null || processor==null){ return null; } |
|||
try { |
|||
StringBuilder sb =new StringBuilder(); |
|||
sb.append("{").append("\n"); |
|||
sb.append("\tio.sc.engine.rule.core.WebRequest request =new io.sc.engine.rule.core.WebRequest();\n"); |
|||
sb.append("\trequest.setHttpMethod(").append("io.sc.engine.rule.core.enums.HttpMethodType.").append(processor.getHttpMethod()).append(");\n"); |
|||
sb.append("\trequest.setHttpUrl(").append(StringUtil.format("${0}", GroovyExpressionReplacer.groovy(processor.getHttpUrl(),String.class.getName()))).append(");\n"); |
|||
if(processor.getHttpAuthType()!=null) { |
|||
sb.append("\trequest.setHttpAuthType(").append("io.sc.engine.rule.core.enums.HttpAuthorizationType.").append(processor.getHttpAuthType()).append(");\n"); |
|||
if(HttpAuthorizationType.BASIC_AUTH.equals(processor.getHttpAuthType())){ |
|||
sb.append("\trequest.setHttpAuthBasicUsername(").append(processor.getHttpAuthBasicUsername()).append(");\n"); |
|||
sb.append("\trequest.setHttpAuthBasicPassword(").append(processor.getHttpAuthBasicPassword()).append(");\n"); |
|||
}else if(HttpAuthorizationType.API_KEY.equals(processor.getHttpAuthType())){ |
|||
sb.append("\trequest.setHttpAuthApikey(").append(processor.getHttpAuthApikey()).append(");\n"); |
|||
sb.append("\trequest.setHttpAuthApiValue(").append(processor.getHttpAuthApiValue()).append(");\n"); |
|||
}else if(HttpAuthorizationType.BEARER.equals(processor.getHttpAuthType())){ |
|||
sb.append("\trequest.setHttpAuthBearerToken(").append(StringUtil.format("${0}", GroovyExpressionReplacer.groovy(processor.getHttpAuthBearerToken(),String.class.getName()))).append(");\n"); |
|||
} |
|||
}else{ |
|||
sb.append("\trequest.setHttpAuthType(").append("io.sc.engine.rule.core.enums.HttpAuthorizationType.NONE);\n"); |
|||
} |
|||
sb.append("\tio.sc.engine.rule.core.WebResponse response =io.sc.engine.rule.core.util.WebRequestUtil.sendWebRequest(request);\n"); |
|||
String groovy =StringUtil.tabs(processor.getHttpResponseMapping().replace("${response}","response"),1); |
|||
groovy =GroovyExpressionReplacer.groovy(groovy); |
|||
sb.append("\t").append(groovy).append("\n"); |
|||
sb.append("}").append("\n"); |
|||
return sb.toString(); |
|||
}catch(Exception e) { |
|||
throw new RuntimeException("There was a Error when generate " + indicator.getName()+ "'s HttpRequest groovy source code.", e); |
|||
} |
|||
} |
|||
} |
@ -0,0 +1 @@ |
|||
#(tabs(HttpRequest.groovy(parameter,processor),2)) |
@ -0,0 +1,89 @@ |
|||
package io.sc.engine.rule.core.util; |
|||
|
|||
import groovy.json.JsonSlurper; |
|||
import io.sc.engine.rule.core.WebRequest; |
|||
import io.sc.engine.rule.core.WebResponse; |
|||
import io.sc.engine.rule.core.enums.HttpAuthorizationType; |
|||
import io.sc.engine.rule.core.enums.HttpMethodType; |
|||
import io.sc.platform.util.StringUtil; |
|||
import okhttp3.*; |
|||
|
|||
import java.nio.charset.StandardCharsets; |
|||
import java.time.Duration; |
|||
import java.util.Base64; |
|||
import java.util.Map; |
|||
|
|||
public class WebRequestUtil { |
|||
public static WebResponse sendWebRequest(WebRequest webRequest) { |
|||
try { |
|||
Headers.Builder headerBuilder = new Headers.Builder().add("Content-Type: application/json"); |
|||
HttpAuthorizationType httpAuthType =webRequest.getHttpAuthType(); |
|||
if(httpAuthType==null){ |
|||
httpAuthType =HttpAuthorizationType.NONE; |
|||
} |
|||
switch (httpAuthType) { |
|||
case NONE: |
|||
break; |
|||
case API_KEY: |
|||
headerBuilder.add(webRequest.getHttpAuthApikey() + "=" + webRequest.getHttpAuthApiValue()); |
|||
break; |
|||
case BASIC_AUTH: |
|||
headerBuilder.add("Authorization:Basic " + Base64.getEncoder().encodeToString(webRequest.getHttpAuthBasicUsername().getBytes(StandardCharsets.UTF_8)) + Base64.getEncoder().encodeToString(webRequest.getHttpAuthBasicPassword().getBytes(StandardCharsets.UTF_8))); |
|||
break; |
|||
case BEARER: |
|||
headerBuilder.add("Authorization: Bearer " + webRequest.getHttpAuthBearerToken()); |
|||
break; |
|||
} |
|||
Headers headers = headerBuilder.build(); |
|||
|
|||
okhttp3.Request.Builder requestBuilder = new okhttp3.Request.Builder().url(webRequest.getHttpUrl()).headers(headers); |
|||
if (HttpMethodType.GET.equals(webRequest.getHttpMethod())) { |
|||
requestBuilder.get(); |
|||
}else if(HttpMethodType.POST.equals(webRequest.getHttpMethod())){ |
|||
RequestBody body = RequestBody.create(webRequest.getHttpRequestBody(), MediaType.parse("application/json; charset=utf-8")); |
|||
requestBuilder.post(body); |
|||
} |
|||
Request request = requestBuilder.build(); |
|||
OkHttpClient client = new OkHttpClient.Builder() |
|||
.connectTimeout(Duration.ofSeconds(60)) |
|||
.readTimeout(Duration.ofSeconds(60)) |
|||
.writeTimeout(Duration.ofSeconds(60)) |
|||
.build(); |
|||
client.dispatcher().setMaxRequests(64); |
|||
client.dispatcher().setMaxRequestsPerHost(6); |
|||
Call call = client.newCall(request); |
|||
Response response = call.execute(); |
|||
WebResponse result = new WebResponse(); |
|||
if(response.isSuccessful()) { |
|||
result.setSuccessful(response.isSuccessful()); |
|||
result.setStatus(response.code()); |
|||
result.setError(null); |
|||
result.setContent(response.body().string()); |
|||
return result; |
|||
}else{ |
|||
result.setSuccessful(response.isSuccessful()); |
|||
result.setStatus(response.code()); |
|||
result.setError("Error occured!"); |
|||
return result; |
|||
} |
|||
}catch (Exception e){ |
|||
WebResponse result = new WebResponse(); |
|||
result.setSuccessful(false); |
|||
result.setStatus(500); |
|||
result.setError(StringUtil.getStackTrace(e)); |
|||
return result; |
|||
} |
|||
} |
|||
|
|||
public static void main(String[] args) { |
|||
WebRequest webRequest =new WebRequest(); |
|||
webRequest.setHttpMethod(HttpMethodType.GET); |
|||
webRequest.setHttpUrl("http://localhost:8090/api/re/resource/getDefineByCode?code=M1744084117959"); |
|||
webRequest.setHttpAuthType(HttpAuthorizationType.BEARER); |
|||
webRequest.setHttpAuthBearerToken("eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJjb3Jwb3JhdGlvbkNvZGUiOiJfUFJJTUFSWV8iLCJjb3Jwb3JhdGlvbk5hbWUiOiLmsqrooaPllYbmnZHplYfpk7booYwiLCJkZWZhdWx0Um9sZUNvZGUiOiJhZG1pbiIsInVzZXJOYW1lIjoi57O757uf566h55CG5ZGYIiwidXNlcklkIjoiZWYyNTMzYzUtODZiYi00YzI2LTgyYWEtNGFhYTA1NGJkYzk4IiwiYXV0aG9yaXRpZXMiOlt7ImNvZGUiOiJhZG1pbiIsIm5hbWUiOiLns7vnu5_nrqHnkIblkZgiLCJpZCI6IjhiMWM4YTAwLTk4MDEtNDAyMC05ODY1LTA0ZDU2ODcxY2ZiOSJ9XSwiZGVmYXVsdFJvbGVOYW1lIjoi57O757uf566h55CG5ZGYIiwibG9naW5OYW1lIjoiYWRtaW4iLCJleHAiOjE3NDQ3MzkxMzEsImlhdCI6MTc0NDcxMDMzMSwianRpIjoiZWQxNzMwOTMtZTIzMi00OWQ1LWI2ZjItNTRkZDRlYjM5ZmEwIiwiZGVmYXVsdFJvbGVJZCI6IjhiMWM4YTAwLTk4MDEtNDAyMC05ODY1LTA0ZDU2ODcxY2ZiOSJ9.C1pDjMUyf5DAZXTzoys9YfDlXbvPkENIe-XIuSoh1QYJ4SYzaX9n5WaQRvZ793cmcVqyTMNFQKlp5F8sWZZnMft-XmrBtH5FTpo2jxGnoexuGUudPCsdRiFzyNMKCgohIkEs-8lWzG_jcJ-otk7UxmBSQQkOAZU3JkVE-rhDiMRzKa9RIJGiqicQ24-Q5ihGJ9aXX_5CgbvKSdqG59pfNHta0u33gxfqwhozU1L8276f07RrrW4lxoF1rB95_OqEObvzOCpZHqWETf6MAo3rqAfEIPOJFENgjX7wXu6PDla85K9cJHbjKFV_dbjT2DmZn98uPlU_2-iimFrxA4Hp3g"); |
|||
WebResponse response =sendWebRequest(webRequest); |
|||
System.out.println(response.getContent()); |
|||
Map o =(Map)new JsonSlurper().parseText(response.getContent()); |
|||
System.out.println(o.get("resource").getClass().getName()); |
|||
} |
|||
} |
@ -1,33 +0,0 @@ |
|||
<#assign dictionaries=($wrapper.dictionaries)!> |
|||
<#list (dictionaries)! as dictionary> |
|||
/** |
|||
* 数据字典类 |
|||
* @author auto generated by engine |
|||
*/ |
|||
@JsonIgnoreProperties(ignoreUnknown=true) |
|||
class ${CodeReplacer.className(dictionary.code)}_V${dictionary.version}{ |
|||
<#list (dictionary.getFields())! as field> |
|||
<#if field.defaultValue??> |
|||
<#if "java.lang.String"==(field.valueType)!> |
|||
String ${CodeReplacer.fieldName(field.code)} ="${field.defaultValue}";//${field.name} |
|||
<#else> |
|||
${ValueType.getSimpleJavaType(field.valueType)} ${CodeReplacer.fieldName(field.code)} =${field.defaultValue};//${field.name} |
|||
</#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> |
@ -1,6 +0,0 @@ |
|||
<#assign functions=$wrapper.functions!> |
|||
<#list functions! as function> |
|||
<#if (function.enable)!> |
|||
${function.body} |
|||
</#if> |
|||
</#list> |
@ -1,115 +0,0 @@ |
|||
<#ftl strip_whitespace=true> |
|||
package io.sc.engine.rule.core.code; |
|||
|
|||
import org.slf4j.Logger; |
|||
import org.slf4j.LoggerFactory; |
|||
|
|||
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; |
|||
import com.fasterxml.jackson.core.type.TypeReference; |
|||
|
|||
import groovy.transform.Canonical; |
|||
|
|||
import java.math.*; |
|||
|
|||
import java.util.Random; |
|||
import java.util.Map; |
|||
|
|||
import io.sc.engine.rule.core.classes.RuleResult; |
|||
import io.sc.engine.rule.core.classes.SingleRuleResult; |
|||
import io.sc.engine.rule.core.classes.ResourceAbstract; |
|||
|
|||
import io.sc.engine.rule.core.code.impl.support.ResourceResult; |
|||
import io.sc.engine.rule.core.code.impl.support.ParameterResult; |
|||
import io.sc.engine.rule.core.code.impl.support.FieldValidator; |
|||
import io.sc.engine.rule.core.code.impl.support.ValidateResult; |
|||
import io.sc.engine.rule.core.enums.ParameterType; |
|||
import io.sc.engine.rule.core.enums.RuntimeInputParameterType; |
|||
import io.sc.engine.rule.core.util.DateUtil; |
|||
import io.sc.engine.rule.core.util.DataTypeConvertor; |
|||
import io.sc.engine.rule.core.util.ESql; |
|||
import io.sc.engine.rule.core.util.JacksonObjectMapper; |
|||
import io.sc.engine.rule.core.util.IdReplacer; |
|||
import io.sc.engine.rule.core.util.Strings; |
|||
|
|||
import io.sc.engine.rule.client.Executor; |
|||
|
|||
import static java.lang.Math.PI; |
|||
import static java.lang.Math.E; |
|||
|
|||
import static java.lang.Math.abs; |
|||
import static java.lang.Math.atan2; |
|||
import static java.lang.Math.cbrt; |
|||
import static java.lang.Math.ceil; |
|||
import static java.lang.Math.exp; |
|||
import static java.lang.Math.expm1; |
|||
import static java.lang.Math.floor; |
|||
import static java.lang.Math.IEEEremainder; |
|||
import static java.lang.Math.pow; |
|||
import static java.lang.Math.random; |
|||
import static java.lang.Math.rint; |
|||
import static java.lang.Math.round; |
|||
import static java.lang.Math.sqrt; |
|||
import static java.lang.Math.toDegrees; |
|||
import static java.lang.Math.toRadians; |
|||
|
|||
import static java.lang.Math.sin; |
|||
import static java.lang.Math.cos; |
|||
import static java.lang.Math.tan; |
|||
|
|||
import static java.lang.Math.asin; |
|||
import static java.lang.Math.acos; |
|||
import static java.lang.Math.atan; |
|||
|
|||
import static java.lang.Math.sinh; |
|||
import static java.lang.Math.cosh; |
|||
import static java.lang.Math.tanh; |
|||
|
|||
|
|||
import static io.sc.engine.rule.core.function.ArithmeticFunction.randomInt; |
|||
import static io.sc.engine.rule.core.function.ArithmeticFunction.max; |
|||
import static io.sc.engine.rule.core.function.ArithmeticFunction.min; |
|||
import static io.sc.engine.rule.core.function.ArithmeticFunction.sum; |
|||
import static io.sc.engine.rule.core.function.ArithmeticFunction.log; |
|||
import static io.sc.engine.rule.core.function.ArithmeticFunction.ln; |
|||
import static io.sc.engine.rule.core.function.ArithmeticFunction.lg; |
|||
import static io.sc.engine.rule.core.function.ArithmeticFunction.root; |
|||
import static io.sc.engine.rule.core.function.ArithmeticFunction.div; |
|||
|
|||
import static io.sc.engine.rule.core.function.ArithmeticFunction.transformSequencing; |
|||
import static io.sc.engine.rule.core.function.DateFunction.now; |
|||
import static io.sc.engine.rule.core.function.DateFunction.yyyyMMdd; |
|||
import static io.sc.engine.rule.core.function.DateFunction.yyyy_MM_dd; |
|||
import static io.sc.engine.rule.core.function.StringFunction.length; |
|||
import static io.sc.engine.rule.core.function.StringFunction.trim; |
|||
import static io.sc.engine.rule.core.function.StringFunction.upperCase; |
|||
import static io.sc.engine.rule.core.function.StringFunction.lowerCase; |
|||
import static io.sc.engine.rule.core.function.StringFunction.contains; |
|||
import static io.sc.engine.rule.core.function.StringFunction.startsWith; |
|||
import static io.sc.engine.rule.core.function.StringFunction.endsWith; |
|||
import static io.sc.engine.rule.core.function.StringFunction.join; |
|||
|
|||
import static io.sc.engine.rule.core.function.NormalDistributionFunction.G; |
|||
import static io.sc.engine.rule.core.function.NormalDistributionFunction.iG; |
|||
import static io.sc.engine.rule.core.function.SpecialValueFunction.isNil; |
|||
import static io.sc.engine.rule.core.function.SpecialValueFunction.isZero; |
|||
import static io.sc.engine.rule.core.function.SpecialValueFunction.isNan; |
|||
import static io.sc.engine.rule.core.function.SpecialValueFunction.isInfinite; |
|||
import static io.sc.engine.rule.core.function.SpecialValueFunction.nil; |
|||
import static io.sc.engine.rule.core.function.SpecialValueFunction.zero; |
|||
import static io.sc.engine.rule.core.function.SpecialValueFunction.nan; |
|||
import static io.sc.engine.rule.core.function.SpecialValueFunction.infinite; |
|||
|
|||
import static io.sc.engine.rule.core.util.NumberFormater.decimal; |
|||
import static io.sc.engine.rule.core.util.NumberFormater.comma; |
|||
import static io.sc.engine.rule.core.util.NumberFormater.money; |
|||
import static io.sc.engine.rule.core.util.NumberFormater.percent; |
|||
|
|||
import io.sc.engine.rule.core.function.JpmmlEvaluator; |
|||
|
|||
<#include "/functions.ftl"/> |
|||
|
|||
<#if $wrapper.type=="RESOURCE"> |
|||
<#include "/resource_groovy.ftl"/> |
|||
<#elseif $wrapper.type=="LIB"> |
|||
<#include "/lib_groovy.ftl"/> |
|||
</#if> |
@ -1,115 +0,0 @@ |
|||
<#assign libs=($wrapper.libs)!> |
|||
<#list (libs)! as lib> |
|||
/** |
|||
* 库类 |
|||
* @author auto generated by engine |
|||
*/ |
|||
@JsonIgnoreProperties(ignoreUnknown=true) |
|||
class ${CodeReplacer.className(lib.code,lib.version)}{ |
|||
private static final Logger log =LoggerFactory.getLogger(${CodeReplacer.className(lib.code,lib.version)}.class); |
|||
<#list (lib.indicators)! as indicator> |
|||
${indicator.forArgumentField($wrapper)} |
|||
</#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 "OBJECT_PROPERTIES"==(processor.type)!> |
|||
<#include "/processor/OBJECT_PROPERTIES.ftl"/> |
|||
<#elseif "OPTION_VALUE"==(processor.type)!> |
|||
<#include "/processor/OPTION_VALUE.ftl"/> |
|||
<#elseif "MATH_FORMULA"==(processor.type)!> |
|||
<#include "/processor/MATH_FORMULA.ftl"/> |
|||
<#elseif "ARITHMETIC"==(processor.type)!> |
|||
<#include "/processor/ARITHMETIC.ftl"/> |
|||
<#elseif "TERNARY"==(processor.type)!> |
|||
<#include "/processor/TERNARY.ftl"/> |
|||
<#elseif "WHEN_THEN"==(processor.type)!> |
|||
<#include "/processor/WHEN_THEN.ftl"/> |
|||
<#elseif "NUMBER_RANGE"==(processor.type)!> |
|||
<#include "/processor/NUMBER_RANGE.ftl"/> |
|||
<#elseif "CONDITION_RANGE"==(processor.type)!> |
|||
<#include "/processor/CONDITION_RANGE.ftl"/> |
|||
<#elseif "DECISION_TABLE_2C"==(processor.type)!> |
|||
<#include "/processor/DECISION_TABLE_2C.ftl"/> |
|||
<#elseif "DECISION_TABLE"==(processor.type)!> |
|||
<#include "/processor/DECISION_TABLE.ftl"/> |
|||
<#elseif "DECISION_TREE"==(processor.type)!> |
|||
<#include "/processor/DECISION_TREE.ftl"/> |
|||
<#elseif "EXECUTION_FLOW"==(processor.type)!> |
|||
<#include "/processor/EXECUTION_FLOW.ftl"/> |
|||
<#elseif "PMML"==(processor.type)!> |
|||
<#include "/processor/PMML.ftl"/> |
|||
<#elseif "GROOVY_SCRIPT"==(processor.type)!> |
|||
<#include "/processor/GROOVY_SCRIPT.ftl"/> |
|||
<#elseif "SQL"==(processor.type)!> |
|||
<#include "/processor/SQL.ftl"/> |
|||
</#if> |
|||
</#list> |
|||
} |
|||
</#if> |
|||
</#list> |
|||
} |
|||
</#list> |
@ -1,201 +0,0 @@ |
|||
<#assign lib=$wrapper.lib> |
|||
/** |
|||
* 指标库类(name:${lib.name}, code:${lib.code}, version:${lib.version}) |
|||
* ${(lib.description)!} |
|||
* @author auto generated by engine |
|||
*/ |
|||
class ${CodeReplacer.className(lib.code,lib.version)}{ |
|||
private static final Logger log =LoggerFactory.getLogger(${CodeReplacer.className(lib.code,lib.version)}.class); |
|||
|
|||
/** |
|||
* 执行方法(Map作为输入参数,该 Map 封装了调用模型的参数) |
|||
* @param map 输入参数封装器 |
|||
* @return 执行结果 |
|||
*/ |
|||
public static ResourceResult execute(Map<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 "OBJECT_PROPERTIES"==(processor.type)!> |
|||
<#include "/processor/OBJECT_PROPERTIES.ftl"/> |
|||
<#elseif "OPTION_VALUE"==(processor.type)!> |
|||
<#include "/processor/OPTION_VALUE.ftl"/> |
|||
<#elseif "MATH_FORMULA"==(processor.type)!> |
|||
<#include "/processor/MATH_FORMULA.ftl"/> |
|||
<#elseif "ARITHMETIC"==(processor.type)!> |
|||
<#include "/processor/ARITHMETIC.ftl"/> |
|||
<#elseif "TERNARY"==(processor.type)!> |
|||
<#include "/processor/TERNARY.ftl"/> |
|||
<#elseif "WHEN_THEN"==(processor.type)!> |
|||
<#include "/processor/WHEN_THEN.ftl"/> |
|||
<#elseif "NUMBER_RANGE"==(processor.type)!> |
|||
<#include "/processor/NUMBER_RANGE.ftl"/> |
|||
<#elseif "CONDITION_RANGE"==(processor.type)!> |
|||
<#include "/processor/CONDITION_RANGE.ftl"/> |
|||
<#elseif "DECISION_TABLE_2C"==(processor.type)!> |
|||
<#include "/processor/DECISION_TABLE_2C.ftl"/> |
|||
<#elseif "DECISION_TABLE"==(processor.type)!> |
|||
<#include "/processor/DECISION_TABLE.ftl"/> |
|||
<#elseif "DECISION_TREE"==(processor.type)!> |
|||
<#include "/processor/DECISION_TREE.ftl"/> |
|||
<#elseif "EXECUTION_FLOW"==(processor.type)!> |
|||
<#include "/processor/EXECUTION_FLOW.ftl"/> |
|||
<#elseif "PMML"==(processor.type)!> |
|||
<#include "/processor/PMML.ftl"/> |
|||
<#elseif "GROOVY_SCRIPT"==(processor.type)!> |
|||
<#include "/processor/GROOVY_SCRIPT.ftl"/> |
|||
<#elseif "SQL"==(processor.type)!> |
|||
<#include "/processor/SQL.ftl"/> |
|||
</#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); |
@ -1,153 +0,0 @@ |
|||
/** |
|||
* 模型参数类 |
|||
* @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> |
|||
} |
|||
} |
|||
} |
@ -1,228 +0,0 @@ |
|||
<#assign model=resource.model> |
|||
/** |
|||
* 资源类(name:${resource.name}, code:${resource.code}, version:${resource.version}) |
|||
* @author auto generated by engine |
|||
*/ |
|||
class ${CodeReplacer.className(resource.code,resource.version)} { |
|||
private static final Logger log =LoggerFactory.getLogger(${CodeReplacer.className(resource.code,resource.version)}.class); |
|||
|
|||
/** |
|||
* 执行方法(Map作为输入参数,该 Map 封装了调用模型的参数) |
|||
* @param map 输入参数封装器 |
|||
* @return 执行结果 |
|||
*/ |
|||
public static ResourceResult execute(Map<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 "OBJECT_PROPERTIES"==(processor.type)!> |
|||
<#include "/processor/OBJECT_PROPERTIES.ftl"/> |
|||
<#elseif "OPTION_VALUE"==(processor.type)!> |
|||
<#include "/processor/OPTION_VALUE.ftl"/> |
|||
<#elseif "MATH_FORMULA"==(processor.type)!> |
|||
<#include "/processor/MATH_FORMULA.ftl"/> |
|||
<#elseif "ARITHMETIC"==(processor.type)!> |
|||
<#include "/processor/ARITHMETIC.ftl"/> |
|||
<#elseif "TERNARY"==(processor.type)!> |
|||
<#include "/processor/TERNARY.ftl"/> |
|||
<#elseif "WHEN_THEN"==(processor.type)!> |
|||
<#include "/processor/WHEN_THEN.ftl"/> |
|||
<#elseif "RULE"==(processor.type)!> |
|||
<#include "/processor/RULE.ftl"/> |
|||
<#elseif "SINGLE_RULE"==(processor.type)!> |
|||
<#include "/processor/SINGLE_RULE.ftl"/> |
|||
<#elseif "NUMBER_RANGE"==(processor.type)!> |
|||
<#include "/processor/NUMBER_RANGE.ftl"/> |
|||
<#elseif "CONDITION_RANGE"==(processor.type)!> |
|||
<#include "/processor/CONDITION_RANGE.ftl"/> |
|||
<#elseif "DECISION_TABLE_2C"==(processor.type)!> |
|||
<#include "/processor/DECISION_TABLE_2C.ftl"/> |
|||
<#elseif "DECISION_TABLE"==(processor.type)!> |
|||
<#include "/processor/DECISION_TABLE.ftl"/> |
|||
<#elseif "DECISION_TREE"==(processor.type)!> |
|||
<#include "/processor/DECISION_TREE.ftl"/> |
|||
<#elseif "EXECUTION_FLOW"==(processor.type)!> |
|||
<#include "/processor/EXECUTION_FLOW.ftl"/> |
|||
<#elseif "PMML"==(processor.type)!> |
|||
<#include "/processor/PMML.ftl"/> |
|||
<#elseif "GROOVY_SCRIPT"==(processor.type)!> |
|||
<#include "/processor/GROOVY_SCRIPT.ftl"/> |
|||
<#elseif "SQL"==(processor.type)!> |
|||
<#include "/processor/SQL.ftl"/> |
|||
</#if> |
|||
</#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); |
@ -1,25 +0,0 @@ |
|||
<#list (subModel.children)! as subModel> |
|||
//子模型(${subModel.fullName}) |
|||
private static void ${subModel.code}(Executor executor,Argument argument){ |
|||
if(log.isDebugEnabled()){log.debug("开始调用子模型: {}","${subModel.fullName}");} |
|||
<#if (subModel.enable)!> |
|||
<#else> |
|||
if(log.isDebugEnabled()){log.debug("开始调用子模型: enable==false");} |
|||
return; |
|||
</#if> |
|||
<#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> |
@ -1,4 +0,0 @@ |
|||
//算数运算 |
|||
${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)} =${ExpressionReplacer.groovy(processor.arithmetic,parameter.valueType<#-- 算数运算,需要进行相关逻辑处理,即使参数类型为字符串也需要执行算数运算表达式 -->)};//${parameter.type}, ${parameter.name} |
|||
if(log.isDebugEnabled()){log.debug(" 算数运算结果 : {}",${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)});} |
|||
|
@ -1,4 +0,0 @@ |
|||
//条件分段函数 |
|||
${ConditionRange.generateGroovyCode(parameter,processor)} |
|||
if(log.isDebugEnabled()){log.debug(" 条件分段函数运算结果 : {}",${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)});} |
|||
|
@ -1,4 +0,0 @@ |
|||
//决策表 |
|||
${DecisionTable.generateGroovyCode(parameter,processor)} |
|||
if(log.isDebugEnabled()){log.debug(" 决策表运算结果 : {}",${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)});} |
|||
|
@ -1,4 +0,0 @@ |
|||
//简单决策表 |
|||
${DecisionTable2C.generateGroovyCode(parameter,processor)} |
|||
if(log.isDebugEnabled()){log.debug(" 简单决策表运算结果 : {}",${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)});} |
|||
|
@ -1,4 +0,0 @@ |
|||
//决策树(此处只是入口,真正的决策树计算逻辑在后面通过一系列方法完成) |
|||
${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)} =Tree_${CodeReplacer.fieldName(parameter.code)}_${DecisionTree.parse(processor.decisionTree).id}(executor,${ExpressionReplacer.ARGUMENT_NAME}); |
|||
if(log.isDebugEnabled()){log.debug(" 决策树运算结果 : {}",${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)});} |
|||
|
@ -1,13 +0,0 @@ |
|||
/*-------------------------------------------------------------------------------* |
|||
* 决策树函数 * |
|||
*-------------------------------------------------------------------------------*/ |
|||
<#list (model.getAllParameters())! as parameter><#-- 循环将每个参数处理生成一个方法 --> |
|||
<#if ("INTERMEDIATE"==parameter.type || "OUT"==parameter.type)> |
|||
<#list (parameter.processors)! as processor> |
|||
<#if "DECISION_TREE"==processor.type> |
|||
//${parameter.name}(${parameter.type}) |
|||
${DecisionTree.generateGroovyCode(parameter,processor)} |
|||
</#if> |
|||
</#list> |
|||
</#if> |
|||
</#list> |
@ -1,4 +0,0 @@ |
|||
//执行流(此处只是入口,真正的执行流计算逻辑在后面通过一系列方法完成) |
|||
Flow_${CodeReplacer.fieldName(parameter.code)}_${ExecutionFlow.parse(processor.executionFlow).id}(executor,${ExpressionReplacer.ARGUMENT_NAME}); |
|||
if(log.isDebugEnabled()){log.debug(" 执行流运算结果 : {}",${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)});} |
|||
|
@ -1,13 +0,0 @@ |
|||
/*-------------------------------------------------------------------------------* |
|||
* 执行流函数 * |
|||
*-------------------------------------------------------------------------------*/ |
|||
<#list (model.getAllParameters())! as parameter><#-- 循环将每个参数处理生成一个方法 --> |
|||
<#if ("INTERMEDIATE"==parameter.type || "OUT"==parameter.type)> |
|||
<#list (parameter.processors)! as processor> |
|||
<#if "EXECUTION_FLOW"==processor.type> |
|||
//${parameter.name}(${parameter.type}) |
|||
${ExecutionFlow.generateGroovyCode(parameter,processor)} |
|||
</#if> |
|||
</#list> |
|||
</#if> |
|||
</#list> |
@ -1,3 +0,0 @@ |
|||
<#if processor.groovyScript??> |
|||
${ExpressionReplacer.groovy(processor.groovyScript,null)} |
|||
</#if> |
@ -1,4 +0,0 @@ |
|||
//数学公式 |
|||
${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)} =${MathFormula.generateGroovyCode(parameter,processor)}; |
|||
if(log.isDebugEnabled()){log.debug(" 数学公式运算结果 : {}",${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)});} |
|||
|
@ -1,4 +0,0 @@ |
|||
//数值分段函数 |
|||
${NumberRange.generateGroovyCode(parameter,processor)} |
|||
if(log.isDebugEnabled()){log.debug(" 数值分段函数运算结果 : {}",${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)});} |
|||
|
@ -1,4 +0,0 @@ |
|||
//对象属性函数 |
|||
${ObjectProperty.generateGroovyCode(parameter,processor)} |
|||
if(log.isDebugEnabled()){log.debug(" 对象属性函数运算结果 : {}",${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)});} |
|||
|
@ -1,34 +0,0 @@ |
|||
//选项值运算 |
|||
<#assign optionParameter=model.getParameterByOptionParameterCode(processor.optionCode)> |
|||
<#if optionParameter??> |
|||
if(${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(optionParameter.code)}!=null){ |
|||
<#list model.getParameterOptionsByOptionParameterCode(processor.optionCode) as option> |
|||
<#if option_index==0> |
|||
<#if optionParameter.valueType=='java.lang.String'> |
|||
if(${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(optionParameter.code)}=="""${option.inputValue}"""){ |
|||
<#else> |
|||
if(${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(optionParameter.code)}==${option.inputValue}){ |
|||
</#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> |
|||
|
@ -1,3 +0,0 @@ |
|||
<#if processor.pmml??> |
|||
arg.${CodeReplacer.fieldName(parameter.code)} =JpmmlEvaluator.evaluate('${parameter.id}_${processor.id}','''${processor.pmml}''',arg.toMap()); |
|||
</#if> |
@ -1,4 +0,0 @@ |
|||
//规则运算 |
|||
${Rule.generateGroovyCode(parameter,processor)} |
|||
if(log.isDebugEnabled()){log.debug(" 算数运算结果 : {}",${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)});} |
|||
|
@ -1,4 +0,0 @@ |
|||
//单规则运算 |
|||
${SingleRule.generateGroovyCode(parameter,processor)} |
|||
if(log.isDebugEnabled()){log.debug(" 算数运算结果 : {}",${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)});} |
|||
|
@ -1,17 +0,0 @@ |
|||
//SQL 运算 |
|||
<#if processor.sqlDatasourceName??> |
|||
javax.sql.DataSource ds =io.sc.engine.rule.client.spring.util.EngineSpringApplicationContextUtil.getDataSource('${processor.sqlDatasourceName}'); |
|||
<#else> |
|||
javax.sql.DataSource ds =io.sc.engine.rule.client.spring.util.EngineSpringApplicationContextUtil.getDefaultDataSource(); |
|||
</#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> |
|||
|
@ -1,4 +0,0 @@ |
|||
//三元运算 |
|||
${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)} =(${ExpressionReplacer.groovy(processor.ternaryCondition,null)}) ? (${ExpressionReplacer.groovy(processor.ternaryTrue,parameter.valueType)}) : (${ExpressionReplacer.groovy(processor.ternaryFalse,parameter.valueType)}); |
|||
if(log.isDebugEnabled()){log.debug(" 三元运算结果 : {}",${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)});} |
|||
|
@ -1,12 +0,0 @@ |
|||
//WhenThen 运算 |
|||
if(${ExpressionReplacer.groovy(processor.when,null)}){ |
|||
${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)} =${ExpressionReplacer.groovy(processor.then,parameter.valueType)}; |
|||
if(log.isDebugEnabled()){log.debug(" WhenThen 运算结果 : {}",${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)});} |
|||
<#-- 如果是短路操作,直接结束处理 --> |
|||
<#if processor.isWhenThenShorted> |
|||
if(log.isDebugEnabled()){log.debug(" WhenThen 短路!!!");} |
|||
if(log.isDebugEnabled()){log.debug(" 参数结果值 : {}",${ExpressionReplacer.ARGUMENT_NAME}.${CodeReplacer.fieldName(parameter.code)});} |
|||
return; |
|||
</#if> |
|||
} |
|||
|
@ -1,11 +0,0 @@ |
|||
<#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> |
@ -1,89 +0,0 @@ |
|||
/********************************************************************************** |
|||
* 评分卡参数类 * |
|||
**********************************************************************************/ |
|||
@JsonIgnoreProperties(ignoreUnknown=true) |
|||
class Argument{ |
|||
<#list (resource.scoreCardVars)! as scoreCardVar> |
|||
<#if 'NUMBER_RANGE'==(scoreCardVar.type)! || 'INDICATOR_NUMBER_RANGE'==(scoreCardVar.type)! || 'INDICATOR_VALUE'==(scoreCardVar.type)!> |
|||
BigDecimal ${CodeReplacer.fieldName(scoreCardVar.code)};//${scoreCardVar.name}, ${scoreCardVar.type} |
|||
<#elseif 'OPTION'==(scoreCardVar.type)! || 'INDICATOR_OPTION'==(scoreCardVar.type)!> |
|||
String ${CodeReplacer.fieldName(scoreCardVar.code)};//${scoreCardVar.name}, ${scoreCardVar.type} |
|||
</#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; |
|||
} |
|||
} |
@ -1,147 +0,0 @@ |
|||
/** |
|||
* 资源类(name:${resource.name}, code:${resource.code}, version:${resource.version}) |
|||
* ${(resource.description)!} |
|||
* @author auto generated by engine |
|||
*/ |
|||
class ${CodeReplacer.className(resource.code)}_V${resource.version}{ |
|||
private static final Logger log =LoggerFactory.getLogger(${CodeReplacer.className(resource.code)}_V${resource.version}.class); |
|||
|
|||
/** |
|||
* 执行方法(Map作为输入参数,该 Map 封装了调用模型的参数) |
|||
* @param map 输入参数封装器 |
|||
* @return 执行结果 |
|||
*/ |
|||
public static ResourceResult execute(Map<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 @@ |
|||
#(tabs(HttpRequest.groovy(parameter,processor),2)) |
@ -1,12 +0,0 @@ |
|||
<template> |
|||
<w-dialog ref="dialogRef" width="800px" :title="$t('myMessages')" :can-maximize="false" @hide="Environment.executeAction('loadSystemAnnouncements')"> |
|||
<router-view v-slot="{ Component }" class="full"> |
|||
<keep-alive> |
|||
<suspense> |
|||
<component :is="Component" :key="route.fullPath" /> |
|||
</suspense> |
|||
</keep-alive> |
|||
</router-view> |
|||
</w-dialog> |
|||
</template> |
|||
<script setup lang="ts"></script> |
@ -1,129 +1,130 @@ |
|||
{ |
|||
"oauth2" : { |
|||
"clientId" : "platform-oidc", |
|||
"clientSecret" : "secret", |
|||
"redirectUri" : "http://localhost:3000" |
|||
"oauth2": { |
|||
"clientId": "platform-oidc", |
|||
"clientSecret": "secret", |
|||
"redirectUri": "http://localhost:3000" |
|||
}, |
|||
"setting" : { |
|||
"homePage" : "/home", |
|||
"i18n" : { |
|||
"availableLocales" : [ "en", "zh_CN", "tw_CN" ], |
|||
"locale" : "zh_CN", |
|||
"fallbackLocale" : "en", |
|||
"fallbackWarn" : false, |
|||
"missingWarn" : false, |
|||
"changeNotify" : true |
|||
"setting": { |
|||
"homePage": "/home", |
|||
"notifierTaskNavigateFrontendRoutePath": null, |
|||
"i18n": { |
|||
"availableLocales": ["en", "zh_CN", "tw_CN"], |
|||
"locale": "zh_CN", |
|||
"fallbackLocale": "en", |
|||
"fallbackWarn": false, |
|||
"missingWarn": false, |
|||
"changeNotify": true |
|||
} |
|||
}, |
|||
"theme" : { |
|||
"dark" : false, |
|||
"minWidth" : 600, |
|||
"favicon" : "favicon.svg", |
|||
"navigateMenuPosition" : "sider", |
|||
"brand" : { |
|||
"dark" : "#1d1d1d", |
|||
"primary" : "#14234a", |
|||
"secondary" : "#26a69a", |
|||
"accent" : "#9c27b0", |
|||
"positive" : "#21ba45", |
|||
"negative" : "#c10015", |
|||
"info" : "#31ccec", |
|||
"warning" : "#f2c037", |
|||
"dark-page" : "#121212" |
|||
"theme": { |
|||
"dark": false, |
|||
"minWidth": 600, |
|||
"favicon": "favicon.svg", |
|||
"navigateMenuPosition": "sider", |
|||
"brand": { |
|||
"dark": "#1d1d1d", |
|||
"primary": "#14234a", |
|||
"secondary": "#26a69a", |
|||
"accent": "#9c27b0", |
|||
"positive": "#21ba45", |
|||
"negative": "#c10015", |
|||
"info": "#31ccec", |
|||
"warning": "#f2c037", |
|||
"dark-page": "#121212" |
|||
}, |
|||
"loadingBar" : { |
|||
"color" : "positive", |
|||
"size" : 3, |
|||
"position" : "top", |
|||
"reverse" : false |
|||
"loadingBar": { |
|||
"color": "positive", |
|||
"size": 3, |
|||
"position": "top", |
|||
"reverse": false |
|||
}, |
|||
"topper" : { |
|||
"height" : 48, |
|||
"color" : "white", |
|||
"bgColor" : "#14234a", |
|||
"logo" : "logo.svg", |
|||
"logoWidth" : 36, |
|||
"logoHeight" : 36, |
|||
"showTitle" : true, |
|||
"titleColor" : "white", |
|||
"actions" : { |
|||
"full-screen" : { |
|||
"enable" : true |
|||
"topper": { |
|||
"height": 48, |
|||
"color": "white", |
|||
"bgColor": "#14234a", |
|||
"logo": "logo.svg", |
|||
"logoWidth": 36, |
|||
"logoHeight": 36, |
|||
"showTitle": true, |
|||
"titleColor": "white", |
|||
"actions": { |
|||
"full-screen": { |
|||
"enable": true |
|||
}, |
|||
"searcher" : { |
|||
"enable" : true |
|||
"searcher": { |
|||
"enable": true |
|||
}, |
|||
"notifier" : { |
|||
"enable" : true |
|||
"notifier": { |
|||
"enable": true |
|||
} |
|||
} |
|||
}, |
|||
"sider" : { |
|||
"position" : "left", |
|||
"sider": { |
|||
"position": "left", |
|||
"isSiderExpaned": false, |
|||
"dense" : true, |
|||
"border" : true, |
|||
"width" : 300, |
|||
"miniWidth" : 100, |
|||
"iconSize" : 22, |
|||
"miniIconSize" : 30, |
|||
"iconColor" : "#000000", |
|||
"activeIconColor" : "#14234a", |
|||
"bgColor" : "#ffffff", |
|||
"activeBgColor" : "#ffffff", |
|||
"color" : "#000000", |
|||
"activeColor" : "#14234a" |
|||
"dense": true, |
|||
"border": true, |
|||
"width": 300, |
|||
"miniWidth": 100, |
|||
"iconSize": 22, |
|||
"miniIconSize": 30, |
|||
"iconColor": "#000000", |
|||
"activeIconColor": "#14234a", |
|||
"bgColor": "#ffffff", |
|||
"activeBgColor": "#ffffff", |
|||
"color": "#000000", |
|||
"activeColor": "#14234a" |
|||
}, |
|||
"tagViewBar" : { |
|||
"height" : 50, |
|||
"homeTagViewCloseable" : false, |
|||
"collapserIconSize" : 20, |
|||
"collapserIconColor" : "#000", |
|||
"moreIconColor" : "#000", |
|||
"bgColor" : "#FFF", |
|||
"borderSize" : 1, |
|||
"borderColor" : "#E5E7EB" |
|||
"tagViewBar": { |
|||
"height": 50, |
|||
"homeTagViewCloseable": false, |
|||
"collapserIconSize": 20, |
|||
"collapserIconColor": "#000", |
|||
"moreIconColor": "#000", |
|||
"bgColor": "#FFF", |
|||
"borderSize": 1, |
|||
"borderColor": "#E5E7EB" |
|||
}, |
|||
"main" : { |
|||
"bgColor" : "#FFFFFF", |
|||
"paddingTop" : 5, |
|||
"paddingRight" : 5, |
|||
"paddingBottom" : 0, |
|||
"paddingLeft" : 5, |
|||
"containerPaddingTop" : 5, |
|||
"containerPaddingRight" : 5, |
|||
"containerPaddingBottom" : 5, |
|||
"containerPaddingLeft" : 5, |
|||
"containerBgColor" : "#EEEEEE" |
|||
"main": { |
|||
"bgColor": "#FFFFFF", |
|||
"paddingTop": 5, |
|||
"paddingRight": 5, |
|||
"paddingBottom": 0, |
|||
"paddingLeft": 5, |
|||
"containerPaddingTop": 5, |
|||
"containerPaddingRight": 5, |
|||
"containerPaddingBottom": 5, |
|||
"containerPaddingLeft": 5, |
|||
"containerBgColor": "#EEEEEE" |
|||
}, |
|||
"footer" : { |
|||
"show" : false, |
|||
"height" : 40, |
|||
"color" : "#ffffff", |
|||
"bgColor" : "#14234a" |
|||
"footer": { |
|||
"show": false, |
|||
"height": 40, |
|||
"color": "#ffffff", |
|||
"bgColor": "#14234a" |
|||
}, |
|||
"login" : { |
|||
"bgImage" : "login-bg.jpg", |
|||
"encodePassword" : true, |
|||
"logoutConfirm" : true |
|||
"login": { |
|||
"bgImage": "login-bg.jpg", |
|||
"encodePassword": true, |
|||
"logoutConfirm": true |
|||
}, |
|||
"scroller" : { |
|||
"enable" : true, |
|||
"position" : "bottom-right", |
|||
"showTitle" : true, |
|||
"color" : "#ffffff", |
|||
"bgColor" : "#14234a", |
|||
"offsetX" : 80, |
|||
"offsetY" : 100 |
|||
"scroller": { |
|||
"enable": true, |
|||
"position": "bottom-right", |
|||
"showTitle": true, |
|||
"color": "#ffffff", |
|||
"bgColor": "#14234a", |
|||
"offsetX": 80, |
|||
"offsetY": 100 |
|||
}, |
|||
"notifier" : { |
|||
"position" : "top", |
|||
"timeout" : 2000 |
|||
"notifier": { |
|||
"position": "top", |
|||
"timeout": 2000 |
|||
}, |
|||
"grid" : { |
|||
"headBgColor" : "#f5f7fa", |
|||
"stickyBgColor" : "#ffffff", |
|||
"borderColor" : "rgba(0, 0, 0, 0.12)" |
|||
"grid": { |
|||
"headBgColor": "#f5f7fa", |
|||
"stickyBgColor": "#ffffff", |
|||
"borderColor": "rgba(0, 0, 0, 0.12)" |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
@ -1,4 +0,0 @@ |
|||
<template> |
|||
<div style="height: 100%">XXXX</div> |
|||
</template> |
|||
<script setup lang="ts"></script> |
Some files were not shown because too many files changed in this diff
Loading…
Reference in new issue