diff --git a/erm.frontend/package.json b/erm.frontend/package.json index e3c476a1..c8dbeea5 100644 --- a/erm.frontend/package.json +++ b/erm.frontend/package.json @@ -1,6 +1,6 @@ { "name": "erm.frontend", - "version": "8.1.27", + "version": "8.1.28", "description": "", "private": false, "keywords": [ @@ -80,7 +80,7 @@ "luckyexcel": "1.0.1", "mockjs": "1.1.0", "pinia": "2.1.7", - "platform-core": "8.1.145", + "platform-core": "8.1.149", "quasar": "2.14.2", "tailwindcss": "3.4.0", "vue": "3.4.3", diff --git a/io.sc.engine.mv.frontend/package.json b/io.sc.engine.mv.frontend/package.json index 117fed30..f5d33058 100644 --- a/io.sc.engine.mv.frontend/package.json +++ b/io.sc.engine.mv.frontend/package.json @@ -1,6 +1,6 @@ { "name": "io.sc.engine.mv.frontend", - "version": "8.1.27", + "version": "8.1.28", "description": "", "private": false, "keywords": [ @@ -80,7 +80,7 @@ "luckyexcel": "1.0.1", "mockjs": "1.1.0", "pinia": "2.1.7", - "platform-core": "8.1.145", + "platform-core": "8.1.149", "quasar": "2.14.2", "tailwindcss": "3.4.0", "vue": "3.4.3", diff --git a/io.sc.engine.mv/src/main/resources/META-INF/platform/plugins/liquibase.json b/io.sc.engine.mv/src/main/resources/META-INF/platform/plugins/liquibase.json index 509b0240..ef752317 100644 --- a/io.sc.engine.mv/src/main/resources/META-INF/platform/plugins/liquibase.json +++ b/io.sc.engine.mv/src/main/resources/META-INF/platform/plugins/liquibase.json @@ -13,7 +13,7 @@ [ { "category" : "install", - "order" : 10000, + "order" : 12000, "description":"模型验证工具", "locations":[ "liquibase/io.sc.engine.mv_8.0.0_20221020__Model Validate Database Schema DDL.xml" diff --git a/io.sc.engine.rule.client.spring/README.adoc b/io.sc.engine.rule.client.spring/README.adoc new file mode 100644 index 00000000..e69de29b diff --git a/io.sc.engine.rule.client.spring/src/main/java/io/sc/engine/rule/client/spring/service/LocalLoader.java b/io.sc.engine.rule.client.spring/src/main/java/io/sc/engine/rule/client/spring/service/LocalLoader.java new file mode 100644 index 00000000..f27ca78b --- /dev/null +++ b/io.sc.engine.rule.client.spring/src/main/java/io/sc/engine/rule/client/spring/service/LocalLoader.java @@ -0,0 +1,10 @@ +package io.sc.engine.rule.client.spring.service; + +import io.sc.engine.rule.client.Loader; + +/** + * 本地资源定义加载器接口 + */ +public interface LocalLoader extends Loader{ + +} diff --git a/io.sc.engine.rule.client.spring/src/main/java/io/sc/engine/rule/client/spring/service/impl/LocalLoaderImpl.java b/io.sc.engine.rule.client.spring/src/main/java/io/sc/engine/rule/client/spring/service/impl/LocalLoaderImpl.java new file mode 100644 index 00000000..00c3c3b6 --- /dev/null +++ b/io.sc.engine.rule.client.spring/src/main/java/io/sc/engine/rule/client/spring/service/impl/LocalLoaderImpl.java @@ -0,0 +1,94 @@ +package io.sc.engine.rule.client.spring.service.impl; + +import java.lang.reflect.Method; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; +import org.springframework.stereotype.Service; +import io.sc.engine.rule.client.spring.service.LocalLoader; +import io.sc.engine.rule.core.classes.ResourceAbstract; +import io.sc.engine.rule.core.code.impl.support.ResourceWrapper; + +@Service("reLocalLoader") +public class LocalLoaderImpl implements LocalLoader{ + @Autowired private ApplicationContext applicationContext; + private Map cache =new ConcurrentHashMap(); + + @Override + public void cleanCache() throws Exception { + cache.clear(); + } + + @Override + public ResourceWrapper getResourceById(String resourceId) throws Exception { + Object bean =applicationContext.getBean("reResourceService"); + if(bean!=null) { + Method method =bean.getClass().getMethod("getDefineById", String.class); + ResourceWrapper result =(ResourceWrapper)method.invoke(bean, resourceId); + return result; + } + return null; + } + + @Override + public ResourceWrapper getResourceByCode(String resourceCode, Integer version) throws Exception { + if(version==null) {//未指定版本时,不缓存,加载最新的 + Object bean =applicationContext.getBean("reResourceService"); + if(bean!=null) { + Method method =bean.getClass().getMethod("getDefineByCode", String.class,Integer.class); + return (ResourceWrapper)method.invoke(bean, resourceCode,version); + } + }else {//指定版本时,缓存 + if(resourceCode!=null && !"".equals(resourceCode.trim())) { + String key =getCacheKey(resourceCode,version); + ResourceWrapper wrapper =cache.get(key); + if(wrapper!=null) { + return wrapper; + }else { + Object bean =applicationContext.getBean("reResourceService"); + if(bean!=null) { + Method method =bean.getClass().getMethod("getDefineByCode", String.class,Integer.class); + wrapper =(ResourceWrapper)method.invoke(bean, resourceCode,version); + if(wrapper!=null) { + key =getCacheKey(resourceCode,version); + if(key!=null && !"".equals(key.trim())) { + cache.put(key, wrapper); + return wrapper; + } + } + } + } + } + return null; + } + + return null; + } + + @SuppressWarnings("all") + @Override + public List getAllReleasableResourceAbstract() throws Exception { + Object bean =applicationContext.getBean("reResourceService"); + if(bean!=null) { + Method method =bean.getClass().getMethod("getAllReleasableResourceAbstract"); + if(method!=null) { + return (List)method.invoke(bean); + } + } + return null; + } + + private String getCacheKey(String code,Integer version) { + String result =""; + if(code!=null && !"".equals(code.trim())) { + result +=code; + } + if(version!=null) { + result +="_" + version; + } + return result; + } +} diff --git a/io.sc.engine.rule.client.spring/src/main/resources/META-INF/services/io.sc.platform.core.initializer.ApplicationInitializer b/io.sc.engine.rule.client.spring/src/main/resources/META-INF/services/io.sc.platform.core.initializer.ApplicationInitializer new file mode 100644 index 00000000..5c3a8460 --- /dev/null +++ b/io.sc.engine.rule.client.spring/src/main/resources/META-INF/services/io.sc.platform.core.initializer.ApplicationInitializer @@ -0,0 +1 @@ +io.sc.engine.rule.client.spring.initializer.AutoCompileDeployedModelInitializer \ No newline at end of file diff --git a/io.sc.engine.rule.client/README.adoc b/io.sc.engine.rule.client/README.adoc new file mode 100644 index 00000000..e69de29b diff --git a/io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/Loader.java b/io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/Loader.java new file mode 100644 index 00000000..c854fd00 --- /dev/null +++ b/io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/Loader.java @@ -0,0 +1,44 @@ +package io.sc.engine.rule.client; + +import io.sc.engine.rule.core.classes.ResourceAbstract; +import io.sc.engine.rule.core.code.impl.support.ResourceWrapper; + +import java.util.List; + + +/** + * 客户端模型定义加载器接口 + */ +public interface Loader { + /** + * 获取资源定义 + * 说明: 通过 ID 加载资源定义时,系统不做缓存 + * @param resourceId 资源唯一标识 + * @return 资源定义 PO 对象 + * @throws Exception 违例 + */ + public ResourceWrapper getResourceById(String resourceId) throws Exception; + + /** + * 获取资源定义 + * 说明: 通过代码和版本加载资源定义时,如果有版本,则缓存,反之,不缓存 + * @param resourceCode 资源代码 + * @param version 资源版本 + * @return 资源定义 PO 对象 + * @throws Exception 违例 + */ + public ResourceWrapper getResourceByCode(String resourceCode,Integer version) throws Exception; + + /** + * 获取所有顶级资源摘要信息 + * @return 所有顶级资源摘要信息 + * @throws Exception 违例 + */ + public List getAllReleasableResourceAbstract() throws Exception; + + /** + * 清除已经加载的模型定义缓存 + * @throws Exception 违例 + */ + public void cleanCache() throws Exception; +} diff --git a/io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/enums/LoaderMode.java b/io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/enums/LoaderMode.java new file mode 100644 index 00000000..4800bcf1 --- /dev/null +++ b/io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/enums/LoaderMode.java @@ -0,0 +1,18 @@ +package io.sc.engine.rule.client.enums; + +/** + * 模型定义加载器模式 + */ +public enum LoaderMode { + LOCAL, //本地 + REMOTE; //远程 + + public static LoaderMode parse(String str) { + if("LOCAL".equalsIgnoreCase(str)) { + return LoaderMode.LOCAL; + }else if("REMOTE".equalsIgnoreCase(str)) { + return LoaderMode.REMOTE; + } + return null; + } +} diff --git a/io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/local/LocalExecutor.java b/io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/local/LocalExecutor.java new file mode 100644 index 00000000..b0f23039 --- /dev/null +++ b/io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/local/LocalExecutor.java @@ -0,0 +1,134 @@ +package io.sc.engine.rule.client.local; + +import io.sc.engine.rule.client.Executor; +import io.sc.engine.rule.client.Loader; +import io.sc.engine.rule.client.runtime.EngineRuntime; +import io.sc.engine.rule.core.code.impl.support.ResourceResult; +import io.sc.engine.rule.core.code.impl.support.ResourceWrapper; + +import java.util.Map; + + +/** + * 本地执行客户端 + */ +public class LocalExecutor implements Executor { + private Loader loader; + + public LocalExecutor() {} + + public LocalExecutor(Loader loader) { + this.loader =loader; + } + + @Override + public void compileById(String resourceId) throws Exception { + ResourceWrapper wrapper =loader.getResourceById(resourceId); + EngineRuntime.getInstance().compileById(resourceId,wrapper); + } + + @Override + public void compileByCode(String resourceCode, Integer version) throws Exception { + ResourceWrapper wrapper =loader.getResourceByCode(resourceCode,version); + EngineRuntime.getInstance().compileByCode(resourceCode,version,wrapper); + } + + @Override + public ResourceResult executeById(String resourceId, String json) throws Exception { + ResourceWrapper wrapper =loader.getResourceById(resourceId); + return EngineRuntime.getInstance().executeById(this,resourceId,wrapper, json); + } + + @Override + public ResourceResult executeById(String resourceId, String subModelCode, String json) throws Exception { + ResourceWrapper wrapper =loader.getResourceById(resourceId); + return EngineRuntime.getInstance().executeById(this,resourceId,wrapper,subModelCode,json); + } + + @Override + public ResourceResult executeById(String resourceId, Map map) throws Exception { + ResourceWrapper wrapper =loader.getResourceById(resourceId); + return EngineRuntime.getInstance().executeById(this,resourceId,wrapper, map); + } + + @Override + public ResourceResult executeById(String resourceId, String subModelCode, Map map) throws Exception { + ResourceWrapper wrapper =loader.getResourceById(resourceId); + return EngineRuntime.getInstance().executeById(this,resourceId,wrapper,subModelCode,map); + } + + @Override + public ResourceResult executeByCode(String resourceCode, Integer version, String json) throws Exception { + ResourceWrapper wrapper =loader.getResourceByCode(resourceCode, version); + return EngineRuntime.getInstance().executeByCode(this,resourceCode,version,wrapper, json); + } + + @Override + public ResourceResult executeByCode(String resourceCode, Integer version, String subModelCode, String json) throws Exception { + ResourceWrapper wrapper =loader.getResourceByCode(resourceCode, version); + return EngineRuntime.getInstance().executeByCode(this,resourceCode,version,wrapper,subModelCode,json); + } + + @Override + public ResourceResult executeByCode(String resourceCode, Integer version, Map map) throws Exception { + ResourceWrapper wrapper =loader.getResourceByCode(resourceCode, version); + return EngineRuntime.getInstance().executeByCode(this,resourceCode,version,wrapper, map); + } + + @Override + public ResourceResult executeByCode(String resourceCode, Integer version, String subModelCode, Map map) throws Exception { + ResourceWrapper wrapper =loader.getResourceByCode(resourceCode, version); + return EngineRuntime.getInstance().executeByCode(this,resourceCode,version,wrapper,subModelCode,map); + } + + + @Override + public void compileByIdForTest(String resourceId) throws Exception { + ResourceWrapper wrapper =loader.getResourceById(resourceId); + wrapper.setIsExecuteTestCase(true); + EngineRuntime.getInstance().compileById(resourceId,wrapper); + } + + @Override + public void compileByCodeForTest(String resourceCode, Integer version) throws Exception { + ResourceWrapper wrapper =loader.getResourceByCode(resourceCode,version); + wrapper.setIsExecuteTestCase(true); + EngineRuntime.getInstance().compileByCode(resourceCode,version,wrapper); + } + + @Override + public ResourceResult executeByIdForTest(String resourceId, Map map) throws Exception { + ResourceWrapper wrapper =loader.getResourceById(resourceId); + wrapper.setIsExecuteTestCase(true); + return EngineRuntime.getInstance().executeById(this,resourceId,wrapper, map); + } + + @Override + public ResourceResult executeByIdForTest(String resourceId, String subModelCode, Map map) throws Exception { + ResourceWrapper wrapper =loader.getResourceById(resourceId); + wrapper.setIsExecuteTestCase(true); + return EngineRuntime.getInstance().executeById(this,resourceId,wrapper,subModelCode,map); + } + + @Override + public ResourceResult executeByCodeForTest(String resourceCode, Integer version, Map map) throws Exception { + ResourceWrapper wrapper =loader.getResourceByCode(resourceCode, version); + wrapper.setIsExecuteTestCase(true); + return EngineRuntime.getInstance().executeByCode(this,resourceCode,version,wrapper, map); + } + + @Override + public ResourceResult executeByCodeForTest(String resourceCode, Integer version, String subModelCode, Map map) throws Exception { + ResourceWrapper wrapper =loader.getResourceByCode(resourceCode, version); + wrapper.setIsExecuteTestCase(true); + return EngineRuntime.getInstance().executeByCode(this,resourceCode,version,wrapper,subModelCode,map); + } + + public Loader getLoader() { + return loader; + } + + public void setLoader(Loader loader) { + this.loader = loader; + } +} diff --git a/io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/remote/RemoteExecutor.java b/io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/remote/RemoteExecutor.java new file mode 100644 index 00000000..48faa59b --- /dev/null +++ b/io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/remote/RemoteExecutor.java @@ -0,0 +1,148 @@ +package io.sc.engine.rule.client.remote; + +import java.util.Map; + +import io.sc.engine.rule.client.Executor; +import io.sc.engine.rule.client.Loader; +import io.sc.engine.rule.core.code.impl.support.ResourceResult; +import io.sc.engine.rule.core.util.HttpRequestUtil; +import io.sc.engine.rule.core.util.JacksonObjectMapper; + +/** + * 远程执行客户端 + */ +public class RemoteExecutor implements Executor{ + private String remoteApiUrl; + private Loader loader; + + public RemoteExecutor() {} + public RemoteExecutor(String remoteApiUrl) { + this.remoteApiUrl =remoteApiUrl; + this.loader =new RemoteLoader(remoteApiUrl); + } + + @Override + public void compileById(String resourceId) throws Exception { + throw new RuntimeException("Remote Executor NOT Supported compile!"); + } + + @Override + public void compileByCode(String resourceCode, Integer version) throws Exception { + throw new RuntimeException("Remote Executor NOT Supported compile!"); + } + @Override + public ResourceResult executeById(String resourceId,String json) throws Exception { + String result =HttpRequestUtil.post(getApiUrlById(resourceId), "",json); + return JacksonObjectMapper.getDefaultObjectMapper().readValue(result, ResourceResult.class); + } + + @Override + public ResourceResult executeById(String resourceId, String subModelCode, String json) throws Exception { + String result =HttpRequestUtil.post(getApiUrlById(resourceId,subModelCode), "",json); + return JacksonObjectMapper.getDefaultObjectMapper().readValue(result, ResourceResult.class); + } + + @Override + public ResourceResult executeById(String resourceId, Map map) throws Exception { + return executeById(resourceId,JacksonObjectMapper.getDefaultObjectMapper().writeValueAsString(map)); + } + + @Override + public ResourceResult executeById(String resourceId, String subModelCode, Map map) throws Exception { + return executeById(resourceId,subModelCode,JacksonObjectMapper.getDefaultObjectMapper().writeValueAsString(map)); + } + + @Override + public ResourceResult executeByCode(String resourceCode, Integer version,String json) throws Exception{ + return executeByCode(resourceCode,version,null,json); + } + + @Override + public ResourceResult executeByCode(String resourceCode, Integer version, String subModelCode, String json) throws Exception { + String result =HttpRequestUtil.post(getApiUrlByCode(resourceCode,version,subModelCode), "",json); + return JacksonObjectMapper.getDefaultObjectMapper().readValue(result, ResourceResult.class); + } + + @Override + public ResourceResult executeByCode(String resourceCode, Integer version, Map map) throws Exception { + return executeByCode(resourceCode,version,JacksonObjectMapper.getDefaultObjectMapper().writeValueAsString(map)); + } + + @Override + public ResourceResult executeByCode(String resourceCode, Integer version, String subModelCode, Map map) throws Exception { + return executeByCode(resourceCode,version,subModelCode,JacksonObjectMapper.getDefaultObjectMapper().writeValueAsString(map)); + } + + @Override + public void compileByIdForTest(String resourceId) throws Exception { + throw new RuntimeException("Remote Executor NOT Supported test mode compile!"); + } + + @Override + public void compileByCodeForTest(String resourceCode, Integer version) throws Exception { + throw new RuntimeException("Remote Executor NOT Supported test mode compile!"); + } + + @Override + public ResourceResult executeByIdForTest(String resourceId, Map map) throws Exception { + throw new RuntimeException("Remote Executor NOT Supported test mode execute!"); + } + + @Override + public ResourceResult executeByIdForTest(String resourceId, String subModelCode, Map map) throws Exception { + throw new RuntimeException("Remote Executor NOT Supported test mode execute!"); + } + + @Override + public ResourceResult executeByCodeForTest(String resourceCode, Integer version, Map map) throws Exception { + throw new RuntimeException("Remote Executor NOT Supported test mode execute!"); + } + + @Override + public ResourceResult executeByCodeForTest(String resourceCode, Integer version, String subModelCode, Map map) throws Exception { + throw new RuntimeException("Remote Executor NOT Supported test mode execute!"); + } + + public String getRemoteApiUrl() { + return remoteApiUrl; + } + public void setRemoteApiUrl(String remoteApiUrl) { + this.remoteApiUrl = remoteApiUrl; + } + + public Loader getLoader() { + return loader; + } + + public void setLoader(Loader loader) { + this.loader = loader; + } + + private String getApiUrlById(String resourceId) { + return remoteApiUrl + "/executeById?resourceId=" + resourceId; + } + + private String getApiUrlById(String resourceId,String subModelCode) { + if(subModelCode!=null && !subModelCode.trim().isEmpty()) { + return remoteApiUrl + "/executeById?resourceId=" + resourceId + "&subModelCode=" + subModelCode; + }else { + return remoteApiUrl + "/executeById?resourceId=" + resourceId; + } + } + + private String getApiUrlByCode(String resourceCode,Integer version,String subModelCode) { + if(version!=null) { + if(subModelCode!=null && !subModelCode.trim().isEmpty()) { + return remoteApiUrl + "/executeByCode?resourceCode=" + resourceCode + "&version=" + version + "&subModelCode=" + subModelCode; + }else { + return remoteApiUrl + "/executeByCode?resourceCode=" + resourceCode + "&version=" + version; + } + }else { + if(subModelCode!=null && !subModelCode.trim().isEmpty()) { + return remoteApiUrl + "/executeByCode?resourceCode=" + resourceCode + "&subModelCode=" + subModelCode; + }else { + return remoteApiUrl + "/executeByCode?resourceCode=" + resourceCode; + } + } + } +} diff --git a/io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/remote/RemoteLoader.java b/io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/remote/RemoteLoader.java new file mode 100644 index 00000000..feceabb4 --- /dev/null +++ b/io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/remote/RemoteLoader.java @@ -0,0 +1,112 @@ +package io.sc.engine.rule.client.remote; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import io.sc.engine.rule.client.Loader; +import io.sc.engine.rule.core.classes.ResourceAbstract; +import io.sc.engine.rule.core.code.impl.support.ResourceWrapper; +import io.sc.engine.rule.core.util.HttpRequestUtil; +import io.sc.engine.rule.core.util.JacksonObjectMapper; + +import com.fasterxml.jackson.core.type.TypeReference; + +public class RemoteLoader implements Loader{ + private static final Logger log =LoggerFactory.getLogger(RemoteLoader.class); + private String remoteApiUrl; + private Map cache =new ConcurrentHashMap(); + + public RemoteLoader() {} + public RemoteLoader(String remoteApiUrl) { + this.remoteApiUrl =remoteApiUrl; + } + + @Override + public void cleanCache() throws Exception { + cache.clear(); + } + + @Override + public ResourceWrapper getResourceById(String resourceId) throws Exception { + if(resourceId!=null && !"".equals(resourceId.trim())) { + String json =HttpRequestUtil.get(getApiUrlById(resourceId)); + return JacksonObjectMapper.getDefaultObjectMapper().readValue(json, ResourceWrapper.class); + } + return null; + } + @Override + public ResourceWrapper getResourceByCode(String resourceCode, Integer version) throws Exception { + if(version==null) {//未指定版本时,不缓存,加载最新的 + String json =HttpRequestUtil.get(getApiUrlByCode(resourceCode,version)); + if(log.isDebugEnabled()) {log.debug("remote resource json:\n{}",json);} + ResourceWrapper wrapper =JacksonObjectMapper.getDefaultObjectMapper().readValue(json, ResourceWrapper.class); + if(log.isDebugEnabled()) {log.debug("resource json:\n{}",JacksonObjectMapper.getDefaultObjectMapper().writeValueAsString(wrapper));} + return wrapper; + }else {//指定版本时,缓存 + if(resourceCode!=null && !"".equals(resourceCode.trim())) { + String key =getCacheKey(resourceCode,version); + ResourceWrapper wrapper =cache.get(key); + if(wrapper!=null) { + return wrapper; + }else { + String json =HttpRequestUtil.get(getApiUrlByCode(resourceCode,version)); + wrapper =JacksonObjectMapper.getDefaultObjectMapper().readValue(json, ResourceWrapper.class); + if(wrapper!=null) { + key =getCacheKey(resourceCode,version); + if(key!=null && !"".equals(key.trim())) { + cache.put(key, wrapper); + return wrapper; + } + } + } + } + return null; + } + } + + @Override + public List getAllReleasableResourceAbstract() throws Exception { + String json =HttpRequestUtil.get(getAllReleasableResourceAbstractApiUrl()); + if(json!=null && !"".equals(json)) { + return JacksonObjectMapper.getDefaultObjectMapper().readValue(json,new TypeReference>(){}); + } + return null; + } + + public String getRemoteApiUrl() { + return remoteApiUrl; + } + public void setRemoteApiUrl(String remoteApiUrl) { + this.remoteApiUrl = remoteApiUrl; + } + + private String getApiUrlById(String modelId) { + return remoteApiUrl + "/getDefineById?id=" + modelId; + } + + private String getApiUrlByCode(String modelCode,Integer version) { + if(version!=null) { + return remoteApiUrl + "/getDefineByCode?code=" + modelCode + "&version=" + version; + }else { + return remoteApiUrl + "/getDefineByCode?code=" + modelCode; + } + } + + private String getAllReleasableResourceAbstractApiUrl() { + return remoteApiUrl + "/getAllReleasableResourceAbstract"; + } + + private String getCacheKey(String code,Integer version) { + String result =""; + if(code!=null && !"".equals(code.trim())) { + result +=code; + } + if(version!=null) { + result +="_" + version; + } + return result; + } +} diff --git a/io.sc.engine.rule.core/README.adoc b/io.sc.engine.rule.core/README.adoc new file mode 100644 index 00000000..e69de29b diff --git a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/classes/ResourceAbstract.java b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/classes/ResourceAbstract.java new file mode 100644 index 00000000..aaa09cbc --- /dev/null +++ b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/classes/ResourceAbstract.java @@ -0,0 +1,79 @@ +package io.sc.engine.rule.core.classes; + +import java.util.Date; + +import io.sc.engine.rule.core.enums.DeployStatus; + +/** + * 资源摘要信息 + * @author wangshaoping + * + */ +public class ResourceAbstract { + private String id; + private String code; + private String name; + private Integer version; + protected DeployStatus status; + protected Date effectiveDate; + + public ResourceAbstract() {} + + public ResourceAbstract(String code,Integer version) { + this.code =code; + this.version =version; + } + + public ResourceAbstract(String id,String code,String name,Integer version) { + this.id =id; + this.code =code; + this.name =name; + this.version =version; + } + + public ResourceAbstract(String id,String code,String name,Integer version,DeployStatus status,Date effectiveDate) { + this.id =id; + this.code =code; + this.name =name; + this.version =version; + this.status =status; + this.effectiveDate =effectiveDate; + } + + public String getId() { + return id; + } + public void setId(String id) { + this.id = id; + } + public String getCode() { + return code; + } + public void setCode(String code) { + this.code = code; + } + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public Integer getVersion() { + return version; + } + public void setVersion(Integer version) { + this.version = version; + } + public DeployStatus getStatus() { + return status; + } + public void setStatus(DeployStatus status) { + this.status = status; + } + public Date getEffectiveDate() { + return effectiveDate; + } + public void setEffectiveDate(Date effectiveDate) { + this.effectiveDate = effectiveDate; + } +} diff --git a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/classes/Rule.java b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/classes/Rule.java new file mode 100644 index 00000000..363dd354 --- /dev/null +++ b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/classes/Rule.java @@ -0,0 +1,121 @@ +package io.sc.engine.rule.core.classes; + +/** + * 规则信息 + * @author wangshaoping + * + */ +public class Rule { + private boolean isTriggered; //是否触发 + private Integer level; //等级 + private String code; //代码 + private String name; //名称 + private String category; //分类 + private String value; //值 + private String message; //触发时消息 + + public Rule() {} + public Rule(boolean isTriggered,Integer level,String code,String name,String category,String value,String message) { + this.isTriggered =isTriggered; + this.level =level; + this.code =code; + this.name =name; + this.category =category; + this.value =value; + this.message =message; + } + + public boolean isTriggered() { + return isTriggered; + } + public void setTriggered(boolean isTriggered) { + this.isTriggered = isTriggered; + } + public Integer getLevel() { + return level; + } + public void setLevel(Integer level) { + this.level = level; + } + public String getCode() { + return code; + } + public void setCode(String code) { + this.code = code; + } + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public String getCategory() { + return category; + } + public void setCategory(String category) { + this.category = category; + } + public String getValue() { + return value; + } + public void setValue(String value) { + this.value = value; + } + public String getMessage() { + return message; + } + public void setMessage(String message) { + this.message = message; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((code == null) ? 0 : code.hashCode()); + result = prime * result + (isTriggered ? 1231 : 1237); + result = prime * result + ((level == null) ? 0 : level.hashCode()); + result = prime * result + ((message == null) ? 0 : message.hashCode()); + result = prime * result + ((name == null) ? 0 : name.hashCode()); + result = prime * result + ((value == null) ? 0 : value.hashCode()); + return result; + } + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Rule other = (Rule) obj; + if (code == null) { + if (other.code != null) + return false; + } else if (!code.equals(other.code)) + return false; + if (isTriggered != other.isTriggered) + return false; + if (level == null) { + if (other.level != null) + return false; + } else if (!level.equals(other.level)) + return false; + if (message == null) { + if (other.message != null) + return false; + } else if (!message.equals(other.message)) + return false; + if (name == null) { + if (other.name != null) + return false; + } else if (!name.equals(other.name)) + return false; + if (value == null) { + if (other.value != null) + return false; + } else if (!value.equals(other.value)) + return false; + return true; + } +} diff --git a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/classes/RuleResult.java b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/classes/RuleResult.java new file mode 100644 index 00000000..af83f9ec --- /dev/null +++ b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/classes/RuleResult.java @@ -0,0 +1,106 @@ +package io.sc.engine.rule.core.classes; + +import java.util.ArrayList; +import java.util.List; + +import io.sc.engine.rule.core.util.JacksonObjectMapper; + +import com.fasterxml.jackson.core.JsonProcessingException; + +/** + * 规则结果值 + * @author wangshaoping + * + */ +public class RuleResult { + private boolean triggered; //是否触发 + private Integer level; //等级 + private List rules =new ArrayList(); //触发的规则集合 + + public void addRule(boolean isTriggered,Integer level,String code,String name,String category,String value,String message) { + Rule rule =new Rule(isTriggered,level,code,name,category,value,message); + rules.add(rule); + if(!this.triggered && isTriggered) { + this.triggered =true; + } + if(this.triggered) { + if(level!=null) { + if(this.level==null) { + this.level =level; + }else { + if(level>this.level) { + this.level =level; + } + } + } + } + } + + public boolean getTriggered() { + return triggered; + } + + public void setTriggered(boolean isTriggered) { + this.triggered = isTriggered; + } + + public Integer getLevel() { + return level; + } + + public void setLevel(Integer level) { + this.level = level; + } + + public List getRules() { + return rules; + } + + public void setRules(List rules) { + this.rules = rules; + } + + @Override + public String toString() { + try { + String result =JacksonObjectMapper.getDefaultObjectMapper().writeValueAsString(this); + return result; + } catch (JsonProcessingException e) { + return "RuleResult [triggered=" + triggered + ", level=" + level + ", rules=" + rules + "]"; + } + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + (triggered ? 1231 : 1237); + result = prime * result + ((level == null) ? 0 : level.hashCode()); + result = prime * result + ((rules == null) ? 0 : rules.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + RuleResult other = (RuleResult) obj; + if (triggered != other.triggered) + return false; + if (level == null) { + if (other.level != null) + return false; + } else if (!level.equals(other.level)) + return false; + if (rules == null) { + if (other.rules != null) + return false; + } else if (!rules.equals(other.rules)) + return false; + return true; + } +} diff --git a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/classes/SingleRuleResult.java b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/classes/SingleRuleResult.java new file mode 100644 index 00000000..ee7143a5 --- /dev/null +++ b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/classes/SingleRuleResult.java @@ -0,0 +1,70 @@ +package io.sc.engine.rule.core.classes; + +import io.sc.engine.rule.core.util.JacksonObjectMapper; + +import com.fasterxml.jackson.core.JsonProcessingException; + +/** + * 单规则结果值 + * @author wangshaoping + * + */ +public class SingleRuleResult { + private boolean triggered; //是否触发 + private Integer level; //等级 + private String category; //分类 + private String value; //值 + private String message; //触发时消息 + + public SingleRuleResult() {} + + public SingleRuleResult(boolean isTriggered,Integer level,String category,String value,String message) { + this.triggered =isTriggered; + this.level =level; + this.category =category; + this.value =value; + this.message =message; + } + + public boolean getTriggered() { + return triggered; + } + public void setTriggered(boolean isTriggered) { + this.triggered = isTriggered; + } + public Integer getLevel() { + return level; + } + public void setLevel(Integer level) { + this.level = level; + } + public String getCategory() { + return category; + } + public void setCategory(String category) { + this.category = category; + } + public String getValue() { + return value; + } + public void setValue(String value) { + this.value = value; + } + public String getMessage() { + return message; + } + public void setMessage(String message) { + this.message = message; + } + + @Override + public String toString() { + try { + String result =JacksonObjectMapper.getDefaultObjectMapper().writeValueAsString(this); + return result; + } catch (JsonProcessingException e) { + return "SingleRuleResult [triggered=" + triggered + ", level=" + level + ", category=" + category + + ", value=" + value + ", message=" + message + "]"; + } + } +} diff --git a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/SourceCode.java b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/SourceCode.java new file mode 100644 index 00000000..80ea81e2 --- /dev/null +++ b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/SourceCode.java @@ -0,0 +1,42 @@ +package io.sc.engine.rule.core.code; + +public class SourceCode { + private String packageName; //包名 + private String className; //类名 + private String source; //类源代码 + + public SourceCode() {} + + public SourceCode(String packageName,String className,String source) { + this.packageName =packageName; + this.className =className; + this.source =source; + } + + public String getQualifiedClassName() { + return this.packageName + "." + this.className; + } + + public String getJavaFileName() { + return this.className + ".java"; + } + + public String getPackageName() { + return packageName; + } + public void setPackageName(String packageName) { + this.packageName = packageName; + } + public String getClassName() { + return className; + } + public void setClassName(String className) { + this.className = className; + } + public String getSource() { + return source; + } + public void setSource(String source) { + this.source = source; + } +} diff --git a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/ModelAbstract.java b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/ModelAbstract.java new file mode 100644 index 00000000..27772838 --- /dev/null +++ b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/ModelAbstract.java @@ -0,0 +1,43 @@ +package io.sc.engine.rule.core.code.impl.support; + +/** + * 模型摘要信息 + * @author wangshaoping + * + */ +public class ModelAbstract { + private String id; + private String code; + private String name; + + public ModelAbstract() {} + + public ModelAbstract(String code) { + this.code =code; + } + + public ModelAbstract(String id,String code,String name) { + this.id =id; + this.code =code; + this.name =name; + } + + public String getId() { + return id; + } + public void setId(String id) { + this.id = id; + } + public String getCode() { + return code; + } + public void setCode(String code) { + this.code = code; + } + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } +} diff --git a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/ParameterResult.java b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/ParameterResult.java new file mode 100644 index 00000000..a16de1cf --- /dev/null +++ b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/ParameterResult.java @@ -0,0 +1,146 @@ +package io.sc.engine.rule.core.code.impl.support; + +import java.math.BigDecimal; +import java.math.RoundingMode; + +import io.sc.engine.rule.core.classes.RuleResult; +import io.sc.engine.rule.core.classes.SingleRuleResult; +import io.sc.engine.rule.core.enums.ParameterType; +import io.sc.engine.rule.core.enums.ValueType; +import io.sc.engine.rule.core.util.JacksonObjectMapper; + +import com.fasterxml.jackson.core.JsonProcessingException; + +/** + * 参数结果 + * @author wangshaoping + * + */ +public class ParameterResult { + private String code; //代码 + private String name; //名称 + private ParameterType type; //参数类型 + private String valueType; //参数值类型 + private Integer valueScale; //参数值精度 + private RoundingMode valueRoundingMode; //参数值四舍五入模式 + private String defaultValue; //默认值 + private String value; //结果值 + private RuleResult ruleResult; //规则结果值 + private SingleRuleResult singleRuleResult; //单规则结果值 + + public ParameterResult() {} + public ParameterResult(String code,String name,ParameterType type,String valueType,String value) { + this.code =code; + this.name =name; + this.type =type; + this.valueType =valueType; + this.value =value; + } + + public ParameterResult(String code,String name,ParameterType type,RuleResult ruleResult) { + this.code =code; + this.name =name; + this.type =type; + this.ruleResult =ruleResult; + } + + public ParameterResult(String code,String name,ParameterType type,SingleRuleResult singleRuleResult) { + this.code =code; + this.name =name; + this.type =type; + this.singleRuleResult =singleRuleResult; + } + + public ParameterResult(String code,String name,ParameterType type,String valueType,Integer valueScale,RoundingMode valueRoundingMode,String value) { + this.code =code; + this.name =name; + this.type =type; + this.valueType =valueType; + this.valueScale =valueScale; + this.valueRoundingMode =valueRoundingMode; + this.value =value; + if(ValueType.Decimal.getJavaType().equals(valueType)) { + if(value!=null && !"".equals(value.trim())) { + BigDecimal _value =new BigDecimal(value); + if(valueScale!=null && valueRoundingMode!=null) { + _value =_value.setScale(valueScale,valueRoundingMode); + this.value =String.format("%." + valueScale + "f", _value); + }else if(valueScale!=null) { + _value =_value.setScale(valueScale); + this.value =String.format("%." + valueScale + "f", _value); + } + } + } + } + + public String getCode() { + return code; + } + public void setCode(String code) { + this.code = code; + } + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public ParameterType getType() { + return type; + } + public void setType(ParameterType type) { + this.type = type; + } + public String getValueType() { + return valueType; + } + public void setValueType(String valueType) { + this.valueType = valueType; + } + public Integer getValueScale() { + return valueScale; + } + public void setValueScale(Integer valueScale) { + this.valueScale = valueScale; + } + public RoundingMode getValueRoundingMode() { + return valueRoundingMode; + } + public void setValueRoundingMode(RoundingMode valueRoundingMode) { + this.valueRoundingMode = valueRoundingMode; + } + public String getDefaultValue() { + return defaultValue; + } + public void setDefaultValue(String defaultValue) { + this.defaultValue = defaultValue; + } + public String getValue() { + return value; + } + public void setValue(String value) { + this.value = value; + } + public RuleResult getRuleResult() { + return ruleResult; + } + public void setRuleResult(RuleResult ruleResult) { + this.ruleResult = ruleResult; + } + public SingleRuleResult getSingleRuleResult() { + return singleRuleResult; + } + public void setSingleRuleResult(SingleRuleResult singleRuleResult) { + this.singleRuleResult = singleRuleResult; + } + @Override + public String toString() { + try { + return JacksonObjectMapper.getDefaultObjectMapper().writeValueAsString(this); + } catch (JsonProcessingException e) { + return "ParameterResult [code=" + code + ", name=" + name + ", type=" + type + ", valueType=" + valueType + + ", valueScale=" + valueScale + ", valueRoundingMode=" + valueRoundingMode + ", defaultValue=" + + defaultValue + ", value=" + value + "]"; + } + } +} diff --git a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/ResourceResult.java b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/ResourceResult.java new file mode 100644 index 00000000..64b74124 --- /dev/null +++ b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/ResourceResult.java @@ -0,0 +1,100 @@ +package io.sc.engine.rule.core.code.impl.support; + +import java.util.ArrayList; +import java.util.List; + +import io.sc.engine.rule.core.enums.ParameterType; +import io.sc.engine.rule.core.util.JacksonObjectMapper; + +import com.fasterxml.jackson.core.JsonProcessingException; + +/** + * 模型结果 + * @author wangshaoping + * + */ +public class ResourceResult { + private int status; + private ValidateResult validateResult; + private List data =new ArrayList(); + + /** + * 添加结果参数 + * @param code 代码 + * @param name 名称 + * @param type 类型 + * @param valueType 值类型 + * @param value 值 + */ + public void addParameterResult(String code,String name,ParameterType type,String valueType,String value) { + data.add(new ParameterResult(code,name,type,valueType,value)); + } + + /** + * 通过参数代码获取参数值 + * @param code 参数代码 + * @return 参数值 + */ + public boolean exists(String code) { + if(code!=null && !"".equals(code.trim())) { + if(data!=null && data.size()>0) { + for(ParameterResult parameterResult : data) { + if(code.equals(parameterResult.getCode())){ + return true; + } + } + } + } + return false; + } + + /** + * 通过参数代码获取参数值 + * @param code 参数代码 + * @return 参数值 + */ + public String getValueByParameterCode(String code) { + if(code!=null && !"".equals(code.trim())) { + if(data!=null && data.size()>0) { + for(ParameterResult parameterResult : data) { + if(code.equals(parameterResult.getCode())){ + return parameterResult.getValue(); + } + } + } + } + return null; + } + + public int getStatus() { + return status; + } + public void setStatus(int status) { + this.status = status; + } + public ValidateResult getValidateResult() { + return validateResult; + } + public void setValidateResult(ValidateResult validateResult) { + this.validateResult = validateResult; + } + public List getData() { + return data; + } + public void setData(List data) { + this.data = data; + } + + public void addParameterResult(ParameterResult result) { + this.data.add(result); + } + + @Override + public String toString() { + try { + return JacksonObjectMapper.getDefaultObjectMapper().writeValueAsString(this); + } catch (JsonProcessingException e) { + return "ResourceResult [status=" + status + ", validateResult=" + validateResult + ", data=" + data + "]"; + } + } +} diff --git a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/ResourceWrapper.java b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/ResourceWrapper.java new file mode 100644 index 00000000..9e449544 --- /dev/null +++ b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/ResourceWrapper.java @@ -0,0 +1,30 @@ +package io.sc.engine.rule.core.code.impl.support; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonSubTypes; +import com.fasterxml.jackson.annotation.JsonTypeInfo; + + +@JsonIgnoreProperties(ignoreUnknown=true) +@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.PROPERTY, property="type",defaultImpl=ResourceWrapper4Resource.class) +@JsonSubTypes({ + @JsonSubTypes.Type(value=ResourceWrapper4Resource.class), + @JsonSubTypes.Type(value=ResourceWrapper4Lib.class) +}) +public abstract class ResourceWrapper { + protected boolean isExecuteTestCase; + + + public boolean getIsExecuteTestCase() { + return isExecuteTestCase; + } + + + public void setIsExecuteTestCase(boolean isExecuteTestCase) { + this.isExecuteTestCase = isExecuteTestCase; + } + + @JsonIgnore + public abstract String getType(); +} diff --git a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/ResourceWrapper4Lib.java b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/ResourceWrapper4Lib.java new file mode 100644 index 00000000..4c974502 --- /dev/null +++ b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/ResourceWrapper4Lib.java @@ -0,0 +1,43 @@ +package io.sc.engine.rule.core.code.impl.support; + +import java.util.List; + +import io.sc.engine.rule.core.po.dictionary.Dictionary; +import io.sc.engine.rule.core.po.lib.Lib; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonTypeName; + +@JsonTypeName("LIB") +@JsonIgnoreProperties(ignoreUnknown=true) +public class ResourceWrapper4Lib extends ResourceWrapper{ + private List dictionaries; + private Lib lib; + + + @Override + @JsonIgnore + public String getType() { + return "LIB"; + } + + + public List getDictionaries() { + return dictionaries; + } + + + public void setDictionaries(List dictionaries) { + this.dictionaries = dictionaries; + } + + + public Lib getLib() { + return lib; + } + + public void setLib(Lib lib) { + this.lib = lib; + } +} diff --git a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/ResourceWrapper4Resource.java b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/ResourceWrapper4Resource.java new file mode 100644 index 00000000..7dc1ae72 --- /dev/null +++ b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/ResourceWrapper4Resource.java @@ -0,0 +1,52 @@ +package io.sc.engine.rule.core.code.impl.support; + +import java.util.List; + +import io.sc.engine.rule.core.po.dictionary.Dictionary; +import io.sc.engine.rule.core.po.lib.Lib; +import io.sc.engine.rule.core.po.resource.Resource; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonTypeName; + + +@JsonTypeName("RESOURCE") +@JsonIgnoreProperties(ignoreUnknown=true) +public class ResourceWrapper4Resource extends ResourceWrapper{ + private Resource resource; + private List dictionaries; + private List libs; + + + @Override + @JsonIgnore + public String getType() { + return "RESOURCE"; + } + + public Resource getResource() { + return resource; + } + + public void setResource(Resource resource) { + this.resource = resource; + } + + public List getDictionaries() { + return dictionaries; + } + + public void setDictionaries(List dictionaries) { + this.dictionaries = dictionaries; + } + + public List getLibs() { + return libs; + } + + public void setLibs(List libs) { + this.libs = libs; + } + +} diff --git a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/ValidateField.java b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/ValidateField.java new file mode 100644 index 00000000..8f10279d --- /dev/null +++ b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/ValidateField.java @@ -0,0 +1,38 @@ +package io.sc.engine.rule.core.code.impl.support; + +public class ValidateField { + private String fieldCode; + private String fieldName; + private String message; + + public ValidateField(String fieldCode,String fieldName,String message) { + this.fieldCode =fieldCode; + this.fieldName =fieldName; + this.message =message; + } + + public String getFieldCode() { + return fieldCode; + } + + public void setFieldCode(String fieldCode) { + this.fieldCode = fieldCode; + } + + public String getFieldName() { + return fieldName; + } + + public void setFieldName(String fieldName) { + this.fieldName = fieldName; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + +} diff --git a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/ValidateResult.java b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/ValidateResult.java new file mode 100644 index 00000000..2cc230c5 --- /dev/null +++ b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/ValidateResult.java @@ -0,0 +1,25 @@ +package io.sc.engine.rule.core.code.impl.support; + +import java.util.ArrayList; +import java.util.List; + + +public class ValidateResult { + private List errorFields =new ArrayList(); + + public void error(String fieldCode,String fieldName,String message) { + errorFields.add(new ValidateField(fieldCode,fieldName,message)); + } + + public boolean hasError() { + return errorFields.size()>0; + } + + public List getErrorFields() { + return errorFields; + } + + public void setErrorFields(List errorFields) { + this.errorFields = errorFields; + } +} diff --git a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/lib/LibUtil.java b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/lib/LibUtil.java new file mode 100644 index 00000000..08af1f38 --- /dev/null +++ b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/lib/LibUtil.java @@ -0,0 +1,54 @@ +package io.sc.engine.rule.core.code.impl.support.lib; + +import java.util.List; + +import io.sc.engine.rule.core.po.lib.Indicator; +import io.sc.engine.rule.core.po.lib.IndicatorLib; +import io.sc.engine.rule.core.po.lib.Lib; + +/** + * 库辅助类 + * @author wangshaoping + * + */ +public class LibUtil { + /** + * 查找指标 + * @param libs 库列表 + * @param libCode 被查找的指标所属库代码 + * @param libVersion 被查找的指标所属库版本 + * @param indicatorCode 被查找的指标代码 + * @return 指标对象 + */ + public static Indicator findIndicator(List libs,String libCode,Integer libVersion,String indicatorCode) { + if(libs==null || libs.size()==0) { + return null; + } + if(libCode==null || "".equals(libCode.trim())) { + return null; + } + if(libVersion==null) { + return null; + } + if(indicatorCode==null || "".equals(indicatorCode.trim())) { + return null; + } + + for(Lib lib : libs) { + if(lib instanceof IndicatorLib) { + IndicatorLib indicatorLib =(IndicatorLib)lib; + if(libCode.equals(indicatorLib.getCode()) && libVersion.equals(indicatorLib.getVersion())) { + List indicators =indicatorLib.getIndicators(); + if(indicators!=null && indicators.size()>0) { + for(Indicator indicator : indicators) { + if(indicatorCode.equals(indicator.getCode())) { + return indicator; + } + } + } + } + } + } + return null; + } +} diff --git a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/parameter/ParameterGroovyCodeContributionItem.java b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/parameter/ParameterGroovyCodeContributionItem.java new file mode 100644 index 00000000..44319944 --- /dev/null +++ b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/parameter/ParameterGroovyCodeContributionItem.java @@ -0,0 +1,9 @@ +package io.sc.engine.rule.core.code.impl.support.parameter; + +import io.sc.engine.rule.core.code.impl.support.ResourceWrapper; + +public interface ParameterGroovyCodeContributionItem { + public String forArgumentField(ResourceWrapper wrapper); + public String forConvertArgumentFromMap(ResourceWrapper wrapper,String targetVarName); + public String forConvertArgumentFromJson(ResourceWrapper wrapper,String targetVarName); +} diff --git a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/processor/NumberRange.java b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/processor/NumberRange.java new file mode 100644 index 00000000..0ee58d5f --- /dev/null +++ b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/processor/NumberRange.java @@ -0,0 +1,245 @@ +package io.sc.engine.rule.core.code.impl.support.processor; + +import java.util.ArrayList; +import java.util.List; + +import io.sc.engine.rule.core.po.lib.Indicator; +import io.sc.engine.rule.core.po.lib.processor.NumberRangeIndicatorProcessor; +import io.sc.engine.rule.core.po.model.Parameter; +import io.sc.engine.rule.core.po.model.processor.NumberRangeParameterProcessor; +import io.sc.engine.rule.core.po.scorecard.NumberRangeScoreCardIndicatorVar; +import io.sc.engine.rule.core.po.scorecard.NumberRangeScoreCardVar; +import io.sc.engine.rule.core.po.scorecard.ScoreCardVar; +import io.sc.engine.rule.core.util.CodeReplacer; +import io.sc.engine.rule.core.util.ExpressionReplacer; +import io.sc.engine.rule.core.util.JacksonObjectMapper; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.core.type.TypeReference; + +@JsonIgnoreProperties(ignoreUnknown=true) +public class NumberRange { + private Boolean minIncluded; + private Double min; + private Double max; + private Boolean maxIncluded; + private String value; + + public static List parse(String json) throws Exception{ + return JacksonObjectMapper.getDefaultObjectMapper().readValue(json, new TypeReference>(){}); + } + + public static String generateGroovyCode(Indicator indicator,NumberRangeIndicatorProcessor processor) throws Exception{ + if(indicator==null || processor==null){ + return null; + } + try { + List numberRanges =parse(processor.getNumberRange()); + List _numberRanges =new ArrayList(); + + //移除空行 + if(numberRanges!=null && numberRanges.size()>0) { + for(NumberRange numberRange : numberRanges) { + if(numberRange.min!=null || numberRange.max!=null || numberRange.value!=null) { + _numberRanges.add(numberRange); + } + } + } + + String parameterName =CodeReplacer.fieldName(indicator.getCode()); + String var =processor.getNumberRangeVar(); + String valueType =indicator.getValueType(); + if(_numberRanges!=null && _numberRanges.size()>0) { + if(var==null || "".equals(var.trim())) { + var =ExpressionReplacer.ARGUMENT_NAME + "." + parameterName; + } + StringBuilder sb =new StringBuilder(); + int size =_numberRanges.size(); + for(int i=0;i=").append(numberRange.min); + }else { + sb.append(ExpressionReplacer.groovy(var, null)).append(">").append(numberRange.min); + } + } + if(numberRange.min!=null && numberRange.max!=null) { + sb.append(" && "); + } + if(numberRange.max!=null) { + if(numberRange.maxIncluded!=null && numberRange.maxIncluded) { + sb.append(ExpressionReplacer.groovy(var, null)).append("<=").append(numberRange.max); + }else { + sb.append(ExpressionReplacer.groovy(var, null)).append("<").append(numberRange.max); + } + } + sb.append(")").append("{").append("\n"); + sb.append("\t\t\t").append(ExpressionReplacer.ARGUMENT_NAME).append(".").append(parameterName).append(" =").append(ExpressionReplacer.groovy(numberRange.value, valueType)).append(";\n"); + sb.append("\t\t}"); + } + return sb.toString(); + } + }catch(Exception e) { + throw new RuntimeException("There was a Error when generate " + indicator.getName()+ "'s NumberRange groovy source code.", e); + } + return null; + } + + public static String generateGroovyCode(Parameter parameter,NumberRangeParameterProcessor processor) throws Exception{ + if(parameter==null || processor==null){ + return null; + } + try { + List numberRanges =parse(processor.getNumberRange()); + List _numberRanges =new ArrayList(); + + //移除空行 + if(numberRanges!=null && numberRanges.size()>0) { + for(NumberRange numberRange : numberRanges) { + if(numberRange.min!=null || numberRange.max!=null || numberRange.value!=null) { + _numberRanges.add(numberRange); + } + } + } + + String parameterName =CodeReplacer.fieldName(parameter.getCode()); + String var =processor.getNumberRangeVar(); + String valueType =parameter.getValueType(); + if(_numberRanges!=null && _numberRanges.size()>0) { + if(var==null || "".equals(var.trim())) { + var =ExpressionReplacer.ARGUMENT_NAME + "." + parameterName; + } + StringBuilder sb =new StringBuilder(); + int size =_numberRanges.size(); + for(int i=0;i=").append(numberRange.min); + }else { + sb.append(ExpressionReplacer.groovy(var, null)).append(">").append(numberRange.min); + } + } + if(numberRange.min!=null && numberRange.max!=null) { + sb.append(" && "); + } + if(numberRange.max!=null) { + if(numberRange.maxIncluded!=null && numberRange.maxIncluded) { + sb.append(ExpressionReplacer.groovy(var, null)).append("<=").append(numberRange.max); + }else { + sb.append(ExpressionReplacer.groovy(var, null)).append("<").append(numberRange.max); + } + } + sb.append(")").append("{").append("\n"); + sb.append("\t\t\t").append(ExpressionReplacer.ARGUMENT_NAME).append(".").append(parameterName).append(" =").append(ExpressionReplacer.groovy(numberRange.value, valueType)).append(";\n"); + sb.append("\t\t}"); + } + return sb.toString(); + } + }catch(Exception e) { + throw new RuntimeException("There was a Error when generate " + parameter.getName()+ "'s NumberRange groovy source code.", e); + } + return null; + } + + public static String generateGroovyCode(ScoreCardVar scoreCardVar) throws Exception{ + try { + List _numberRanges =null; + if(scoreCardVar instanceof NumberRangeScoreCardVar) { + _numberRanges =parse(((NumberRangeScoreCardVar)scoreCardVar).getNumberRange()); + }else if(scoreCardVar instanceof NumberRangeScoreCardIndicatorVar) { + _numberRanges =parse(((NumberRangeScoreCardIndicatorVar)scoreCardVar).getNumberRange()); + }else { + return null; + } + + String parameterName =scoreCardVar.getCode(); + String var ="${" + parameterName + "}"; + String valueType ="java.math.BigDecimal"; + if(_numberRanges!=null && _numberRanges.size()>0) { + StringBuilder sb =new StringBuilder(); + int size =_numberRanges.size(); + for(int i=0;i=").append(numberRange.min); + }else { + sb.append(ExpressionReplacer.groovy(var, null)).append(">").append(numberRange.min); + } + } + if(numberRange.min!=null && numberRange.max!=null) { + sb.append(" && "); + } + if(numberRange.max!=null) { + if(numberRange.maxIncluded!=null && numberRange.maxIncluded) { + sb.append(ExpressionReplacer.groovy(var, null)).append("<=").append(numberRange.max); + }else { + sb.append(ExpressionReplacer.groovy(var, null)).append("<").append(numberRange.max); + } + } + sb.append(")").append("{").append("\n"); + sb.append("\t\t\t").append(ExpressionReplacer.ARGUMENT_NAME).append(".R_").append(parameterName).append(" =").append(ExpressionReplacer.groovy(numberRange.value, valueType)).append(";\n"); + sb.append("\t\t}"); + } + return sb.toString(); + } + }catch(Exception e) { + throw new RuntimeException("There was a Error when generate " + scoreCardVar.getName()+ "'s NumberRange groovy source code.", e); + } + return null; + } + + public Boolean getMinIncluded() { + return minIncluded; + } + public void setMinIncluded(Boolean minIncluded) { + this.minIncluded = minIncluded; + } + public Double getMin() { + return min; + } + public void setMin(Double min) { + this.min = min; + } + public Double getMax() { + return max; + } + public void setMax(Double max) { + this.max = max; + } + public Boolean getMaxIncluded() { + return maxIncluded; + } + public void setMaxIncluded(Boolean maxIncluded) { + this.maxIncluded = maxIncluded; + } + public String getValue() { + return value; + } + public void setValue(String value) { + this.value = value; + } +} diff --git a/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/processor/Option.java b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/processor/Option.java new file mode 100644 index 00000000..0b81a019 --- /dev/null +++ b/io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/impl/support/processor/Option.java @@ -0,0 +1,104 @@ +package io.sc.engine.rule.core.code.impl.support.processor; + +import java.util.List; + +import io.sc.engine.rule.core.po.scorecard.OptionScoreCardIndicatorVar; +import io.sc.engine.rule.core.po.scorecard.OptionScoreCardVar; +import io.sc.engine.rule.core.po.scorecard.ScoreCardVar; +import io.sc.engine.rule.core.util.ExpressionReplacer; +import io.sc.engine.rule.core.util.JacksonObjectMapper; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.core.type.TypeReference; + +@JsonIgnoreProperties(ignoreUnknown=true) +public class Option { + private String uuid; + private String value; + private String title; + private String description; + private String score; + + public static List