Browse Source

基础框架发布: 8.2.21

1) 规则引擎中,移除模型或子模型类型"定量(输入)"
  2) 规则引擎中,增加参数别名,是否作为指标持久化,附加属性
  3)规则引擎中,调整代码编辑器提示,显示当前模型前面模型的相关参数
  4)规则引擎中,增加服务器执行器配置,支持远程调用
main
wangshaoping 3 months ago
parent
commit
3a610424bd
  1. 12
      app.platform/build.gradle
  2. 2
      build.gradle
  3. 2
      gradle.properties
  4. 2
      io.sc.engine.rule.client.spring/src/main/java/io/sc/engine/rule/client/spring/initializer/AutoCompileDeployedModelInitializer.java
  5. 12
      io.sc.engine.rule.client.spring/src/main/java/io/sc/engine/rule/client/spring/service/ExecutorFactoryService.java
  6. 10585
      io.sc.engine.rule.client.spring/src/main/java/io/sc/engine/rule/client/spring/service/ExecutorFactoryService_structure.puml
  7. 137
      io.sc.engine.rule.client.spring/src/main/java/io/sc/engine/rule/client/spring/service/impl/ExecutorFactoryServiceImpl.java
  8. 73
      io.sc.engine.rule.client.spring/src/main/java/io/sc/engine/rule/client/spring/service/impl/LocalLoaderImpl.java
  9. 18
      io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/Executor.java
  10. 18
      io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/local/LocalExecutor.java
  11. 40
      io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/remote/RemoteExecutor.java
  12. 71
      io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/remote/RemoteLoader.java
  13. 22
      io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/runtime/EngineRuntime.java
  14. 115
      io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/runtime/impl/GroovyEngineRuntime.java
  15. 74
      io.sc.engine.rule.client/src/test/java/io/sc/engine/rule/client/test/Test.java
  16. 12
      io.sc.engine.rule.client/src/test/resources/logback-test.xml
  17. 100
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/ResourceResult.java
  18. 11
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/ExecuteUnit.java
  19. 2
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/ExecuteUnit4Resource.java
  20. 1
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/enums/ModelCategory.java
  21. 6
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/enums/ParameterPropertiesName.java
  22. 25
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/model/Parameter.java
  23. 18
      io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/resource/ModelResource.java
  24. 6
      io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/argument_render.tpl
  25. 10
      io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/impl/resource.tpl
  26. 2
      io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/import_render.tpl
  27. 7
      io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/i18n/enums.properties
  28. 7
      io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/i18n/enums_tw_CN.properties
  29. 7
      io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/i18n/enums_zh_CN.properties
  30. 8
      io.sc.engine.rule.frontend/src/i18n/messages.json
  31. 8
      io.sc.engine.rule.frontend/src/i18n/messages_tw_CN.json
  32. 8
      io.sc.engine.rule.frontend/src/i18n/messages_zh_CN.json
  33. 41
      io.sc.engine.rule.frontend/src/views/resources/Resources.vue
  34. 128
      io.sc.engine.rule.frontend/src/views/resources/designer/Parameter.vue
  35. 28
      io.sc.engine.rule.frontend/src/views/shared/AutoCompletionManager.ts
  36. 3
      io.sc.engine.rule.frontend/src/views/shared/enums/EngineEnums.ts
  37. 105
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/common/service/impl/ParameterAndValueTypeServiceImpl.java
  38. 49
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/executable/controller/ExecuteUnitWebController.java
  39. 14
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/executable/service/ExecuteUnitService.java
  40. 140
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/executable/service/impl/ExecuteUnitServiceImpl.java
  41. 1
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/lib/repository/LibRepository.java
  42. 4
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/converter/ParameterEntityConverter.java
  43. 101
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/entity/ParameterEntity.java
  44. 34
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/vo/ParameterVo.java
  45. 197
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/resource/controller/ResourceWebController.java
  46. 12
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/resource/entity/ModelResourceEntity.java
  47. 9
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/resource/repository/ResourceRepository.java
  48. 54
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/resource/service/ResourceService.java
  49. 203
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/resource/service/impl/ResourceServiceImpl.java
  50. 9
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/resource/vo/ModelResourceVo.java
  51. 21
      io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/testcase/service/impl/TestCaseServiceImpl.java
  52. 32
      io.sc.engine.rule.server/src/main/resources/META-INF/platform/plugins/parameters.json
  53. 5
      io.sc.engine.rule.server/src/main/resources/liquibase/RE_1.0.0_20220515__Rule Engine Database Schema DDL.xml
  54. 1
      io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/words.properties
  55. 1
      io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/words_tw_CN.properties
  56. 1
      io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/words_zh_CN.properties

12
app.platform/build.gradle

@ -40,16 +40,16 @@ dependencies {
project(":io.sc.engine.st.frontend"),
//
project(":erm"),
project(":erm.frontend"),
//project(":erm"),
//project(":erm.frontend"),
// cips
project(":cips"),
project(":cips.frontend"),
//project(":cips"),
//project(":cips.frontend"),
//
project(":wra.report"),
project(":wra.report.frontend"),
//project(":wra.report"),
//project(":wra.report.frontend"),
)
}

2
build.gradle

@ -57,7 +57,7 @@ subprojects {
//
// exclude group: "org.apache.logging.log4j", module: "log4j-api"
// exclude group: "org.apache.logging.log4j", module: "log4j-to-slf4j"
// exclude group: "org.slf4j", module: "slf4j-jdk14"
exclude group: "org.slf4j", module: "slf4j-jdk14"
exclude group: "org.slf4j", module: "slf4j-nop"
exclude group: "org.slf4j", module: "slf4j-reload4j"
//exclude group: "com.mysql", module: "mysql-connector-j"

2
gradle.properties

@ -37,7 +37,7 @@ application_version=1.0.0
# platform
###########################################################
platform_group=io.sc
platform_version=8.2.20
platform_version=8.2.21
platform_plugin_version=8.2.10
platform_core_frontend_version=8.2.82

2
io.sc.engine.rule.client.spring/src/main/java/io/sc/engine/rule/client/spring/initializer/AutoCompileDeployedModelInitializer.java

@ -52,7 +52,7 @@ public class AutoCompileDeployedModelInitializer implements ApplicationInitializ
}
if(executorFactoryService!=null) {
Executor executor=executorFactoryService.getExecutor();
Executor executor=executorFactoryService.getServerExecutor();
if(executor!=null) {
try {
List<ResourceAbstract> resources =new ArrayList<>();//executor.getLoader().getAllReleasableResourceAbstract();

12
io.sc.engine.rule.client.spring/src/main/java/io/sc/engine/rule/client/spring/service/ExecutorFactoryService.java

@ -7,8 +7,14 @@ import io.sc.engine.rule.client.Executor;
*/
public interface ExecutorFactoryService {
/**
* 获取执行器
* @return 执行器
* 获取客户端执行器
* @return 客户端执行器
*/
public Executor getExecutor();
public Executor getClientExecutor();
/**
* 获取服务器端执行器
* @return 服务器端执行器
*/
public Executor getServerExecutor();
}

10585
io.sc.engine.rule.client.spring/src/main/java/io/sc/engine/rule/client/spring/service/ExecutorFactoryService_structure.puml

File diff suppressed because it is too large

137
io.sc.engine.rule.client.spring/src/main/java/io/sc/engine/rule/client/spring/service/impl/ExecutorFactoryServiceImpl.java

@ -24,65 +24,116 @@ import io.sc.engine.rule.client.spring.util.EngineSpringApplicationContextUtil;
public class ExecutorFactoryServiceImpl implements ExecutorFactoryService{
private static final Logger log =LoggerFactory.getLogger(ExecutorFactoryServiceImpl.class);
private static final String EXECUTOR_MODE_KEY ="parameter.re.client.executorMode";
private static final String LOADER_MODE_KEY ="parameter.re.client.loaderMode";
private static final String REMOTE_API_URL_KEY ="parameter.re.client.remoteApiUrl";
private static final String CLIENT_EXECUTOR_MODE_KEY ="parameter.re.client.executorMode";
private static final String CLIENT_LOADER_MODE_KEY ="parameter.re.client.loaderMode";
private static final String CLIENT_REMOTE_API_URL_KEY ="parameter.re.client.remoteApiUrl";
private static final String SERVER_EXECUTOR_MODE_KEY ="parameter.re.server.executorMode";
private static final String SERVER_LOADER_MODE_KEY ="parameter.re.server.loaderMode";
private static final String SERVER_REMOTE_API_URL_KEY ="parameter.re.server.remoteApiUrl";
@Autowired private RuntimeService runtimeService;
@Autowired private SystemParameterService systemParameterService;
@Autowired private LocalLoader localLoader;
@Autowired private ApplicationContext applicationContext;
private ExecutorMode lastExecutorMode; //上一次保存的执行器执行模式
private LoaderMode lastLoaderMode; //上一次保存的加载器执行模式
private String lastRemoteApiUrl; //上一次保存的远程服务器 api url 地址
private ExecutorMode clientLastExecutorMode; //上一次保存的执行器执行模式(客户端)
private LoaderMode clientLastLoaderMode; //上一次保存的加载器执行模式(客户端)
private String clientLastRemoteApiUrl; //上一次保存的远程服务器 api url 地址(客户端)
private ExecutorMode serverLastExecutorMode; //上一次保存的执行器执行模式(服务器端)
private LoaderMode serverLastLoaderMode; //上一次保存的加载器执行模式(服务器端)
private String serverLastRemoteApiUrl; //上一次保存的远程服务器 api url 地址(服务器端)
private Executor executor;
private Executor clientExecutor; //执行器(客户端)
private Executor serverExecutor; //执行器(服务器端)
@PostConstruct
public void init() {
try {
EngineSpringApplicationContextUtil.setApplicationContext(applicationContext);
executor =buildExecutor();
clientExecutor = buildClientExecutor();
serverExecutor = buildServerExecutor();
} catch (Exception e) {
log.error("",e);
}
}
@Override
public Executor getClientExecutor() {
if(!runtimeService.isReady()) {
return null;
}
if(clientExecutor !=null) return clientExecutor;
try {
Map<String,String> parameters =systemParameterService.getParameters(new String[] {
CLIENT_EXECUTOR_MODE_KEY,
CLIENT_LOADER_MODE_KEY,
CLIENT_REMOTE_API_URL_KEY
});
ExecutorMode executorMode =ExecutorMode.parse(parameters.get(CLIENT_EXECUTOR_MODE_KEY));
LoaderMode loaderMode =LoaderMode.parse(parameters.get(CLIENT_LOADER_MODE_KEY));
String remoteApiUrl =parameters.get(CLIENT_REMOTE_API_URL_KEY);
if(
executorMode!=null && executorMode.equals(clientLastExecutorMode)
&& loaderMode!=null && loaderMode.equals(clientLastLoaderMode)
&& remoteApiUrl!=null && remoteApiUrl.equals(clientLastRemoteApiUrl)
) {
return clientExecutor;
}else {
if(ExecutorMode.LOCAL.equals(executorMode) && LoaderMode.LOCAL.equals(loaderMode)) {
clientExecutor =new LocalExecutor(localLoader);
}else {
clientExecutor =new ExecutorBuilder().build(executorMode, loaderMode, remoteApiUrl);
}
clientLastExecutorMode =executorMode;
clientLastLoaderMode =loaderMode;
clientLastRemoteApiUrl =remoteApiUrl;
return clientExecutor;
}
} catch (Exception e) {
log.error("",e);
return null;
}
}
@Override
public Executor getExecutor() {
public Executor getServerExecutor() {
if(!runtimeService.isReady()) {
return null;
}
if(executor!=null) return executor;
if(serverExecutor !=null) return serverExecutor;
try {
Map<String,String> parameters =systemParameterService.getParameters(new String[] {
EXECUTOR_MODE_KEY,
LOADER_MODE_KEY,
REMOTE_API_URL_KEY
SERVER_EXECUTOR_MODE_KEY,
SERVER_LOADER_MODE_KEY,
SERVER_REMOTE_API_URL_KEY
});
ExecutorMode executorMode =ExecutorMode.parse(parameters.get(EXECUTOR_MODE_KEY));
LoaderMode loaderMode =LoaderMode.parse(parameters.get(LOADER_MODE_KEY));
String remoteApiUrl =parameters.get(REMOTE_API_URL_KEY);
ExecutorMode executorMode =ExecutorMode.parse(parameters.get(SERVER_EXECUTOR_MODE_KEY));
LoaderMode loaderMode =LoaderMode.parse(parameters.get(SERVER_LOADER_MODE_KEY));
String remoteApiUrl =parameters.get(SERVER_REMOTE_API_URL_KEY);
if(
executorMode!=null && executorMode.equals(lastExecutorMode)
&& loaderMode!=null && loaderMode.equals(lastLoaderMode)
&& remoteApiUrl!=null && remoteApiUrl.equals(lastRemoteApiUrl)
executorMode!=null && executorMode.equals(serverLastExecutorMode)
&& loaderMode!=null && loaderMode.equals(serverLastLoaderMode)
&& remoteApiUrl!=null && remoteApiUrl.equals(serverLastRemoteApiUrl)
) {
return executor;
return serverExecutor;
}else {
if(ExecutorMode.LOCAL.equals(executorMode) && LoaderMode.LOCAL.equals(loaderMode)) {
executor =new LocalExecutor(localLoader);
serverExecutor =new LocalExecutor(localLoader);
}else {
executor =new ExecutorBuilder().build(executorMode, loaderMode, remoteApiUrl);
serverExecutor =new ExecutorBuilder().build(executorMode, loaderMode, remoteApiUrl);
}
lastExecutorMode =executorMode;
lastLoaderMode =loaderMode;
lastRemoteApiUrl =remoteApiUrl;
return executor;
serverLastExecutorMode =executorMode;
serverLastLoaderMode =loaderMode;
serverLastRemoteApiUrl =remoteApiUrl;
return serverExecutor;
}
} catch (Exception e) {
log.error("",e);
@ -90,19 +141,39 @@ public class ExecutorFactoryServiceImpl implements ExecutorFactoryService{
}
}
private Executor buildExecutor() throws Exception{
private Executor buildClientExecutor() throws Exception{
if(!runtimeService.isReady()) {
return null;
}
Map<String,String> parameters =systemParameterService.getParameters(new String[] {
CLIENT_EXECUTOR_MODE_KEY,
CLIENT_LOADER_MODE_KEY,
CLIENT_REMOTE_API_URL_KEY
});
ExecutorMode executorMode =ExecutorMode.parse(parameters.get(CLIENT_EXECUTOR_MODE_KEY));
LoaderMode loaderMode =LoaderMode.parse(parameters.get(CLIENT_LOADER_MODE_KEY));
String remoteApiUrl =parameters.get(CLIENT_REMOTE_API_URL_KEY);
if(ExecutorMode.LOCAL.equals(executorMode) && LoaderMode.LOCAL.equals(loaderMode)) {
return new LocalExecutor(localLoader);
}else {
return new ExecutorBuilder().build(executorMode, loaderMode, remoteApiUrl);
}
}
private Executor buildServerExecutor() throws Exception{
if(!runtimeService.isReady()) {
return null;
}
Map<String,String> parameters =systemParameterService.getParameters(new String[] {
EXECUTOR_MODE_KEY,
LOADER_MODE_KEY,
REMOTE_API_URL_KEY
SERVER_EXECUTOR_MODE_KEY,
SERVER_LOADER_MODE_KEY,
SERVER_REMOTE_API_URL_KEY
});
ExecutorMode executorMode =ExecutorMode.parse(parameters.get(EXECUTOR_MODE_KEY));
LoaderMode loaderMode =LoaderMode.parse(parameters.get(LOADER_MODE_KEY));
String remoteApiUrl =parameters.get(REMOTE_API_URL_KEY);
ExecutorMode executorMode =ExecutorMode.parse(parameters.get(SERVER_EXECUTOR_MODE_KEY));
LoaderMode loaderMode =LoaderMode.parse(parameters.get(SERVER_LOADER_MODE_KEY));
String remoteApiUrl =parameters.get(SERVER_REMOTE_API_URL_KEY);
if(ExecutorMode.LOCAL.equals(executorMode) && LoaderMode.LOCAL.equals(loaderMode)) {
return new LocalExecutor(localLoader);
}else {

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

@ -2,6 +2,10 @@ package io.sc.engine.rule.client.spring.service.impl;
import io.sc.engine.rule.client.spring.service.LocalLoader;
import io.sc.engine.rule.core.code.ExecuteUnit;
import io.sc.engine.rule.core.util.HttpRequestUtil;
import io.sc.platform.util.ObjectMapperUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Service;
@ -12,64 +16,49 @@ import java.util.concurrent.ConcurrentHashMap;
@Service("io.sc.engine.rule.client.spring.service.impl.LocalLoaderImpl")
public class LocalLoaderImpl implements LocalLoader{
private static final String RESOURCE_SERVICE_BEAN_NAME ="io.sc.engine.rule.server.resource.service.impl.ResourceServiceImpl";
private static final Logger log = LoggerFactory.getLogger(LocalLoaderImpl.class);
private static final String RESOURCE_SERVICE_BEAN_NAME ="io.sc.engine.rule.server.executable.service.impl.ExecuteUnitServiceImpl";
@Autowired private ApplicationContext applicationContext;
private Map<String, ExecuteUnit> cache =new ConcurrentHashMap<>();
@Override
public ExecuteUnit load(String resourceId) throws Exception {
Object bean =applicationContext.getBean(RESOURCE_SERVICE_BEAN_NAME);
if(bean!=null) {
Method method =bean.getClass().getMethod("getDefineById", String.class);
ExecuteUnit result =(ExecuteUnit)method.invoke(bean, resourceId);
return result;
}
return null;
return doLoad(resourceId,null,null);
}
@Override
public ExecuteUnit load(String resourceCode, Integer version) throws Exception {
if(resourceCode==null || "".equals(resourceCode.trim())){
return null;
}
if(version==null) {//未指定版本时,不缓存,加载最新的
Object bean =applicationContext.getBean(RESOURCE_SERVICE_BEAN_NAME);
if(bean!=null) {
Method method =bean.getClass().getMethod("getDefineByCode", String.class,Integer.class);
return (ExecuteUnit)method.invoke(bean, resourceCode,version);
}
return doLoad(null,resourceCode,version);
}else {//指定版本时,缓存
if(resourceCode!=null && !"".equals(resourceCode.trim())) {
String key =getCacheKey(resourceCode,version);
ExecuteUnit wrapper =cache.get(key);
if(wrapper!=null) {
return wrapper;
}else {
Object bean =applicationContext.getBean(RESOURCE_SERVICE_BEAN_NAME);
if(bean!=null) {
Method method =bean.getClass().getMethod("getDefineByCode", String.class,Integer.class);
wrapper =(ExecuteUnit)method.invoke(bean, resourceCode,version);
if(wrapper!=null) {
key =getCacheKey(resourceCode,version);
if(key!=null && !"".equals(key.trim())) {
cache.put(key, wrapper);
return wrapper;
}
}
}
}
ExecuteUnit wrapper =cache.get(resourceCode + "_V" + version);
if(wrapper==null){
wrapper = doLoad(null,resourceCode,version);
cache.put(resourceCode + "_V" + version, wrapper);
}
return null;
return wrapper;
}
return null;
}
private String getCacheKey(String code,Integer version) {
String result ="";
if(code!=null && !"".equals(code.trim())) {
result +=code;
private ExecuteUnit doLoad(String resourceId,String resourceCode, Integer version) throws Exception {
if((resourceId==null || "".equals(resourceId.trim())) && (resourceCode==null || "".equals(resourceCode.trim()))){
return null;
}
if(version!=null) {
result +="_" + version;
Object executeUnitServiceBean =applicationContext.getBean(RESOURCE_SERVICE_BEAN_NAME);
if(executeUnitServiceBean==null) { return null; }
if(resourceId!=null && !"".equals(resourceId.trim())){
if(log.isDebugEnabled()) {log.debug("load locale resource by id ......");}
Method method =executeUnitServiceBean.getClass().getMethod("findById", String.class);
return (ExecuteUnit)method.invoke(executeUnitServiceBean, resourceId);
}else{
if(log.isDebugEnabled()) {log.debug("load local resource by code and version ......");}
Method method =executeUnitServiceBean.getClass().getMethod("findByCodeAndVersion", String.class, Integer.class);
return (ExecuteUnit)method.invoke(executeUnitServiceBean, resourceCode,version);
}
return result;
}
}

18
io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/Executor.java

@ -1,6 +1,6 @@
package io.sc.engine.rule.client;
import io.sc.engine.rule.core.ResourceResult;
import io.sc.engine.rule.core.ExecuteResult;
import java.util.Map;
@ -18,16 +18,16 @@ public interface Executor {
public void compileById(String resourceId) throws Exception;
public void compileByCode(String resourceCode, Integer version) throws Exception;
public ResourceResult executeById(String resourceId,Map<String,Object> map) throws Exception;
public ResourceResult executeById(String resourceId, String json) throws Exception;
public ExecuteResult executeById(String resourceId, Map<String,Object> map) throws Exception;
public ExecuteResult executeById(String resourceId, String json) throws Exception;
public ResourceResult executeById(String resourceId,String subModelCode,Map<String,Object> map) throws Exception;
public ResourceResult executeById(String resourceId,String subModelCode,String json) throws Exception;
public ExecuteResult executeById(String resourceId,String subModelCode,Map<String,Object> map) throws Exception;
public ExecuteResult executeById(String resourceId,String subModelCode,String json) throws Exception;
public ResourceResult executeByCode(String resourceCode,Integer version,Map<String,Object> map) throws Exception;
public ResourceResult executeByCode(String resourceCode,Integer version,String json) throws Exception;
public ExecuteResult executeByCode(String resourceCode,Integer version,Map<String,Object> map) throws Exception;
public ExecuteResult executeByCode(String resourceCode,Integer version,String json) throws Exception;
public ResourceResult executeByCode(String resourceCode,Integer version,String subModelCode,Map<String,Object> map) throws Exception;
public ResourceResult executeByCode(String resourceCode,Integer version,String subModelCode,String json) throws Exception;
public ExecuteResult executeByCode(String resourceCode,Integer version,String subModelCode,Map<String,Object> map) throws Exception;
public ExecuteResult executeByCode(String resourceCode,Integer version,String subModelCode,String json) throws Exception;
}

18
io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/local/LocalExecutor.java

@ -3,7 +3,7 @@ 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.ResourceResult;
import io.sc.engine.rule.core.ExecuteResult;
import io.sc.engine.rule.core.code.ExecuteUnit;
import java.util.Map;
@ -39,49 +39,49 @@ public class LocalExecutor implements Executor {
}
@Override
public ResourceResult executeById(String resourceId, Map<String, Object> map) throws Exception {
public ExecuteResult executeById(String resourceId, Map<String, Object> map) throws Exception {
ExecuteUnit executeUnit =loader.load(resourceId);
return EngineRuntime.getInstance().execute(this,resourceId,executeUnit, map);
}
@Override
public ResourceResult executeById(String resourceId, String json) throws Exception {
public ExecuteResult executeById(String resourceId, String json) throws Exception {
ExecuteUnit executeUnit =loader.load(resourceId);
return EngineRuntime.getInstance().execute(this,resourceId,executeUnit, json);
}
@Override
public ResourceResult executeById(String resourceId, String subModelCode, Map<String, Object> map) throws Exception {
public ExecuteResult executeById(String resourceId, String subModelCode, Map<String, Object> map) throws Exception {
ExecuteUnit executeUnit =loader.load(resourceId);
return EngineRuntime.getInstance().execute(this,resourceId,executeUnit,subModelCode,map);
}
@Override
public ResourceResult executeById(String resourceId, String subModelCode, String json) throws Exception {
public ExecuteResult executeById(String resourceId, String subModelCode, String json) throws Exception {
ExecuteUnit executeUnit =loader.load(resourceId);
return EngineRuntime.getInstance().execute(this,resourceId,executeUnit,subModelCode,json);
}
@Override
public ResourceResult executeByCode(String resourceCode, Integer version, Map<String, Object> map) throws Exception {
public ExecuteResult executeByCode(String resourceCode, Integer version, Map<String, Object> map) throws Exception {
ExecuteUnit executeUnit =loader.load(resourceCode, version);
return EngineRuntime.getInstance().execute(this,resourceCode,version,executeUnit, map);
}
@Override
public ResourceResult executeByCode(String resourceCode, Integer version, String json) throws Exception {
public ExecuteResult executeByCode(String resourceCode, Integer version, String json) throws Exception {
ExecuteUnit executeUnit =loader.load(resourceCode, version);
return EngineRuntime.getInstance().execute(this,resourceCode,version,executeUnit, json);
}
@Override
public ResourceResult executeByCode(String resourceCode, Integer version, String subModelCode, Map<String, Object> map) throws Exception {
public ExecuteResult executeByCode(String resourceCode, Integer version, String subModelCode, Map<String, Object> map) throws Exception {
ExecuteUnit executeUnit =loader.load(resourceCode, version);
return EngineRuntime.getInstance().execute(this,resourceCode,version,executeUnit,subModelCode,map);
}
@Override
public ResourceResult executeByCode(String resourceCode, Integer version, String subModelCode, String json) throws Exception {
public ExecuteResult executeByCode(String resourceCode, Integer version, String subModelCode, String json) throws Exception {
ExecuteUnit executeUnit =loader.load(resourceCode, version);
return EngineRuntime.getInstance().execute(this,resourceCode,version,executeUnit,subModelCode,json);
}

40
io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/remote/RemoteExecutor.java

@ -2,7 +2,7 @@ package io.sc.engine.rule.client.remote;
import io.sc.engine.rule.client.Executor;
import io.sc.engine.rule.client.Loader;
import io.sc.engine.rule.core.ResourceResult;
import io.sc.engine.rule.core.ExecuteResult;
import io.sc.engine.rule.core.util.HttpRequestUtil;
import io.sc.platform.util.ObjectMapperUtil;
@ -37,47 +37,47 @@ public class RemoteExecutor implements Executor{
}
@Override
public ResourceResult executeById(String resourceId, Map<String, Object> map) throws Exception {
public ExecuteResult executeById(String resourceId, Map<String, Object> map) throws Exception {
return executeById(resourceId,ObjectMapperUtil.json().writeValueAsString(map));
}
@Override
public ResourceResult executeById(String resourceId, String json) throws Exception {
public ExecuteResult executeById(String resourceId, String json) throws Exception {
String result =HttpRequestUtil.post(getApiUrlById(resourceId), "",json);
return ObjectMapperUtil.json().readValue(result, ResourceResult.class);
return ObjectMapperUtil.json().readValue(result, ExecuteResult.class);
}
@Override
public ResourceResult executeById(String resourceId, String subModelCode, Map<String, Object> map) throws Exception {
public ExecuteResult executeById(String resourceId, String subModelCode, Map<String, Object> map) throws Exception {
return executeById(resourceId, subModelCode,ObjectMapperUtil.json().writeValueAsString(map));
}
@Override
public ResourceResult executeById(String resourceId, String subModelCode, String json) throws Exception {
public ExecuteResult executeById(String resourceId, String subModelCode, String json) throws Exception {
String result =HttpRequestUtil.post(getApiUrlById(resourceId,subModelCode), "",json);
return ObjectMapperUtil.json().readValue(result, ResourceResult.class);
return ObjectMapperUtil.json().readValue(result, ExecuteResult.class);
}
@Override
public ResourceResult executeByCode(String resourceCode, Integer version, Map<String, Object> map) throws Exception {
public ExecuteResult executeByCode(String resourceCode, Integer version, Map<String, Object> map) throws Exception {
return executeByCode(resourceCode,version,ObjectMapperUtil.json().writeValueAsString(map));
}
@Override
public ResourceResult executeByCode(String resourceCode, Integer version, String json) throws Exception {
public ExecuteResult executeByCode(String resourceCode, Integer version, String json) throws Exception {
String result =HttpRequestUtil.post(getApiUrlByCode(resourceCode,version,null), "",json);
return ObjectMapperUtil.json().readValue(result, ResourceResult.class);
return ObjectMapperUtil.json().readValue(result, ExecuteResult.class);
}
@Override
public ResourceResult executeByCode(String resourceCode, Integer version, String subModelCode, Map<String, Object> map) throws Exception {
public ExecuteResult executeByCode(String resourceCode, Integer version, String subModelCode, Map<String, Object> map) throws Exception {
return executeByCode(resourceCode,version,subModelCode,ObjectMapperUtil.json().writeValueAsString(map));
}
@Override
public ResourceResult executeByCode(String resourceCode, Integer version, String subModelCode, String json) throws Exception {
public ExecuteResult executeByCode(String resourceCode, Integer version, String subModelCode, String json) throws Exception {
String result =HttpRequestUtil.post(getApiUrlByCode(resourceCode,version,subModelCode), "",json);
return ObjectMapperUtil.json().readValue(result, ResourceResult.class);
return ObjectMapperUtil.json().readValue(result, ExecuteResult.class);
}
public String getRemoteApiUrl() {
@ -88,29 +88,29 @@ public class RemoteExecutor implements Executor{
}
private String getApiUrlById(String resourceId) {
return remoteApiUrl + "/executeById?resourceId=" + resourceId;
return remoteApiUrl + "/api/re/executable/executeById/" + resourceId;
}
private String getApiUrlById(String resourceId,String subModelCode) {
if(subModelCode!=null && !subModelCode.trim().isEmpty()) {
return remoteApiUrl + "/executeById?resourceId=" + resourceId + "&subModelCode=" + subModelCode;
return remoteApiUrl + "/api/re/executable/executeById/" + resourceId + "/" + subModelCode;
}else {
return remoteApiUrl + "/executeById?resourceId=" + resourceId;
return remoteApiUrl + "/api/re/executable/executeById/" + 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;
return remoteApiUrl + "/api/re/executable/executeByCodeAndVersion/" + resourceCode + "/" + version + "/" + subModelCode;
}else {
return remoteApiUrl + "/executeByCode?resourceCode=" + resourceCode + "&version=" + version;
return remoteApiUrl + "/api/re/executable/executeByCodeAndVersion/" + resourceCode + "/" + version;
}
}else {
if(subModelCode!=null && !subModelCode.trim().isEmpty()) {
return remoteApiUrl + "/executeByCode?resourceCode=" + resourceCode + "&subModelCode=" + subModelCode;
return remoteApiUrl + "/api/re/executable/executeByCodeAndVersion/" + resourceCode + "//" + subModelCode;
}else {
return remoteApiUrl + "/executeByCode?resourceCode=" + resourceCode;
return remoteApiUrl + "/api/re/executable/executeByCodeAndVersion/" + resourceCode;
}
}
}

71
io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/remote/RemoteLoader.java

@ -22,43 +22,45 @@ public class RemoteLoader implements Loader{
@Override
public ExecuteUnit load(String resourceId) throws Exception {
if(resourceId!=null && !"".equals(resourceId.trim())) {
String json =HttpRequestUtil.get(getApiUrlById(resourceId));
return ObjectMapperUtil.json().readValue(json, ExecuteUnit.class);
}
return null;
return doLoad(resourceId,null,null);
}
@Override
public ExecuteUnit load(String resourceCode, Integer version) throws Exception {
if(resourceCode==null || "".equals(resourceCode.trim())){
return null;
}
if(version==null) {//未指定版本时,不缓存,加载最新的
String json =HttpRequestUtil.get(getApiUrlByCode(resourceCode,version));
if(log.isDebugEnabled()) {log.debug("remote resource json:\n{}",json);}
ExecuteUnit wrapper =ObjectMapperUtil.json().readValue(json, ExecuteUnit.class);
if(log.isDebugEnabled()) {log.debug("resource json:\n{}",ObjectMapperUtil.json().writeValueAsString(wrapper));}
return wrapper;
return doLoad(null,resourceCode,version);
}else {//指定版本时,缓存
if(resourceCode!=null && !"".equals(resourceCode.trim())) {
String key =getCacheKey(resourceCode,version);
ExecuteUnit wrapper =cache.get(key);
if(wrapper!=null) {
return wrapper;
}else {
String json =HttpRequestUtil.get(getApiUrlByCode(resourceCode,version));
wrapper =ObjectMapperUtil.json().readValue(json, ExecuteUnit.class);
if(wrapper!=null) {
key =getCacheKey(resourceCode,version);
if(key!=null && !"".equals(key.trim())) {
cache.put(key, wrapper);
return wrapper;
}
}
}
ExecuteUnit wrapper =cache.get(resourceCode + "_V" + version);
if(wrapper==null){
wrapper = doLoad(null,resourceCode,version);
cache.put(resourceCode + "_V" + version, wrapper);
}
return wrapper;
}
}
private ExecuteUnit doLoad(String resourceId,String resourceCode, Integer version) throws Exception {
if((resourceId==null || "".equals(resourceId.trim())) && (resourceCode==null || "".equals(resourceCode.trim()))){
return null;
}
String json =null;
if(resourceId!=null && !"".equals(resourceId.trim())){
if(log.isDebugEnabled()) {log.debug("load remote resource by id ......");}
json =HttpRequestUtil.get(getApiUrlById(resourceId));
}else{
if(log.isDebugEnabled()) {log.debug("load remote resource by code and version ......");}
json =HttpRequestUtil.get(getApiUrlByCode(resourceCode,version));
}
if(log.isDebugEnabled()) {log.debug("remote resource loaded, json:\n{}",json);}
ExecuteUnit wrapper =ObjectMapperUtil.json().readValue(json, ExecuteUnit.class);
return wrapper;
}
public String getRemoteApiUrl() {
return remoteApiUrl;
}
@ -67,25 +69,14 @@ public class RemoteLoader implements Loader{
}
private String getApiUrlById(String modelId) {
return remoteApiUrl + "/getDefineById?id=" + modelId;
return remoteApiUrl + "/api/re/executable/findById/" + modelId;
}
private String getApiUrlByCode(String modelCode,Integer version) {
if(version!=null) {
return remoteApiUrl + "/getDefineByCode?code=" + modelCode + "&version=" + version;
return remoteApiUrl + "/api/re/executable/findByCodeAndVersion/" + modelCode + "/" + version;
}else {
return remoteApiUrl + "/getDefineByCode?code=" + modelCode;
}
}
private String getCacheKey(String code,Integer version) {
String result ="";
if(code!=null && !"".equals(code.trim())) {
result +=code;
}
if(version!=null) {
result +="_" + version;
return remoteApiUrl + "/api/re/executable/findByCodeAndVersion/" + modelCode;
}
return result;
}
}

22
io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/runtime/EngineRuntime.java

@ -1,12 +1,12 @@
package io.sc.engine.rule.client.runtime;
import java.util.Map;
import io.sc.engine.rule.client.Executor;
import io.sc.engine.rule.client.runtime.impl.GroovyEngineRuntime;
import io.sc.engine.rule.core.ResourceResult;
import io.sc.engine.rule.core.ExecuteResult;
import io.sc.engine.rule.core.code.ExecuteUnit;
import java.util.Map;
public abstract class EngineRuntime {
public static final String GROOVY ="groovy";
@ -25,14 +25,14 @@ public abstract class EngineRuntime {
public abstract void compile(String resourceId, ExecuteUnit wrapper) throws Exception;
public abstract void compile(String resourceCode, Integer version, ExecuteUnit wrapper) throws Exception;
public abstract ResourceResult execute(Executor executor, String resourceId, ExecuteUnit wrapper, String json) throws Exception;
public abstract ResourceResult execute(Executor executor, String resourceId, ExecuteUnit wrapper, Map<String,Object> map) throws Exception;
public abstract ResourceResult execute(Executor executor, String resourceId, ExecuteUnit wrapper, String subModelCode, String json) throws Exception;
public abstract ResourceResult execute(Executor executor, String resourceId, ExecuteUnit wrapper, String subModelCode, Map<String,Object> map) throws Exception;
public abstract ExecuteResult execute(Executor executor, String resourceId, ExecuteUnit wrapper, String json) throws Exception;
public abstract ExecuteResult execute(Executor executor, String resourceId, ExecuteUnit wrapper, Map<String,Object> map) throws Exception;
public abstract ExecuteResult execute(Executor executor, String resourceId, ExecuteUnit wrapper, String subModelCode, String json) throws Exception;
public abstract ExecuteResult execute(Executor executor, String resourceId, ExecuteUnit wrapper, String subModelCode, Map<String,Object> map) throws Exception;
public abstract ResourceResult execute(Executor executor, String resourceCode, Integer version, ExecuteUnit wrapper, String json) throws Exception;
public abstract ResourceResult execute(Executor executor, String resourceCode, Integer version, ExecuteUnit wrapper, Map<String,Object> map) throws Exception;
public abstract ResourceResult execute(Executor executor, String resourceCode, Integer version, ExecuteUnit wrapper, String subModelCode, String json) throws Exception;
public abstract ResourceResult execute(Executor executor, String resourceCode, Integer version, ExecuteUnit wrapper, String subModelCode, Map<String,Object> map) throws Exception;
public abstract ExecuteResult execute(Executor executor, String resourceCode, Integer version, ExecuteUnit wrapper, String json) throws Exception;
public abstract ExecuteResult execute(Executor executor, String resourceCode, Integer version, ExecuteUnit wrapper, Map<String,Object> map) throws Exception;
public abstract ExecuteResult execute(Executor executor, String resourceCode, Integer version, ExecuteUnit wrapper, String subModelCode, String json) throws Exception;
public abstract ExecuteResult execute(Executor executor, String resourceCode, Integer version, ExecuteUnit wrapper, String subModelCode, Map<String,Object> map) throws Exception;
}

115
io.sc.engine.rule.client/src/main/java/io/sc/engine/rule/client/runtime/impl/GroovyEngineRuntime.java

@ -1,19 +1,20 @@
package io.sc.engine.rule.client.runtime.impl;
import java.util.HashMap;
import java.util.Map;
import io.sc.engine.rule.core.ResourceResult;
import io.sc.engine.rule.core.code.*;
import io.sc.engine.rule.core.code.generator.GroovySourceCodeGenerator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import io.sc.engine.rule.client.Executor;
import io.sc.engine.rule.client.runtime.EngineRuntime;
import io.sc.engine.rule.client.runtime.impl.groovy.GroovyScriptEngineService;
import io.sc.engine.rule.client.runtime.impl.groovy.GroovyScriptEngineServiceImpl;
import io.sc.engine.rule.core.ExecuteResult;
import io.sc.engine.rule.core.code.*;
import io.sc.engine.rule.core.code.generator.GroovySourceCodeGenerator;
import io.sc.engine.rule.core.po.lib.Lib;
import io.sc.engine.rule.core.po.resource.Resource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils;
import java.util.HashMap;
import java.util.Map;
public class GroovyEngineRuntime extends EngineRuntime{
private static final Logger log =LoggerFactory.getLogger(GroovyEngineRuntime.class);
@ -69,66 +70,114 @@ public class GroovyEngineRuntime extends EngineRuntime{
}
@Override
public ResourceResult execute(Executor executor, String resourceId, ExecuteUnit wrapper, String json) throws Exception {
SourceCode code = generator.generate(resourceId,wrapper);
public ExecuteResult execute(Executor executor, String resourceId, ExecuteUnit wrapper, String json) throws Exception {
SourceCode code =null;
if(StringUtils.hasText(wrapper.getSourceCode())){
code =new SourceCode();
code.setSource(wrapper.getSourceCode());
}else {
code = generator.generate(resourceId, wrapper);
}
if(log.isDebugEnabled()) {log.debug("generated groovy source code:\n{}",code.getSource());}
ResourceResult result =(ResourceResult)service.eval(code.getSource(), "INPUT_PARAMETER", prepareParameter(executor,null,json));
ExecuteResult result =(ExecuteResult)service.eval(code.getSource(), "INPUT_PARAMETER", prepareParameter(executor,null,json));
return result;
}
@Override
public ResourceResult execute(Executor executor, String resourceId, ExecuteUnit wrapper, Map<String, Object> map) throws Exception {
SourceCode code = generator.generate(resourceId,wrapper);
public ExecuteResult execute(Executor executor, String resourceId, ExecuteUnit wrapper, Map<String, Object> map) throws Exception {
SourceCode code =null;
if(StringUtils.hasText(wrapper.getSourceCode())){
code =new SourceCode();
code.setSource(wrapper.getSourceCode());
}else {
code = generator.generate(resourceId, wrapper);
}
if(log.isDebugEnabled()) {log.debug("generated groovy source code:\n{}",code.getSource());}
ResourceResult result =(ResourceResult)service.eval(code.getSource(), "INPUT_PARAMETER", prepareParameter(executor,null,map));
ExecuteResult result =(ExecuteResult)service.eval(code.getSource(), "INPUT_PARAMETER", prepareParameter(executor,null,map));
return result;
}
@Override
public ResourceResult execute(Executor executor, String resourceId, ExecuteUnit wrapper, String subModelCode, String json) throws Exception {
SourceCode code = generator.generate(resourceId,wrapper);
public ExecuteResult execute(Executor executor, String resourceId, ExecuteUnit wrapper, String subModelCode, String json) throws Exception {
SourceCode code =null;
if(StringUtils.hasText(wrapper.getSourceCode())){
code =new SourceCode();
code.setSource(wrapper.getSourceCode());
}else {
code = generator.generate(resourceId, wrapper);
}
if(log.isDebugEnabled()) {log.debug("generated groovy source code:\n{}",code.getSource());}
ResourceResult result =(ResourceResult)service.eval(code.getSource(), "INPUT_PARAMETER", prepareParameter(executor,subModelCode,json));
ExecuteResult result =(ExecuteResult)service.eval(code.getSource(), "INPUT_PARAMETER", prepareParameter(executor,subModelCode,json));
return result;
}
@Override
public ResourceResult execute(Executor executor, String resourceId, ExecuteUnit wrapper, String subModelCode, Map<String, Object> map) throws Exception {
SourceCode code = generator.generate(resourceId,wrapper);
public ExecuteResult execute(Executor executor, String resourceId, ExecuteUnit wrapper, String subModelCode, Map<String, Object> map) throws Exception {
SourceCode code =null;
if(StringUtils.hasText(wrapper.getSourceCode())){
code =new SourceCode();
code.setSource(wrapper.getSourceCode());
}else {
code = generator.generate(resourceId, wrapper);
}
if(log.isDebugEnabled()) {log.debug("generated groovy source code:\n{}",code.getSource());}
ResourceResult result =(ResourceResult)service.eval(code.getSource(), "INPUT_PARAMETER", prepareParameter(executor,subModelCode,map));
ExecuteResult result =(ExecuteResult)service.eval(code.getSource(), "INPUT_PARAMETER", prepareParameter(executor,subModelCode,map));
return result;
}
@Override
public ResourceResult execute(Executor executor, String resourceCode, Integer version, ExecuteUnit wrapper, String json) throws Exception {
SourceCode code = generator.generate(resourceCode,version,wrapper);
public ExecuteResult execute(Executor executor, String resourceCode, Integer version, ExecuteUnit wrapper, String json) throws Exception {
SourceCode code =null;
if(StringUtils.hasText(wrapper.getSourceCode())){
code =new SourceCode();
code.setSource(wrapper.getSourceCode());
}else {
code = generator.generate(resourceCode,version,wrapper);
}
if(log.isDebugEnabled()) {log.debug("generated groovy source code:\n{}",code.getSource());}
ResourceResult result =(ResourceResult)service.eval(code.getSource(), "INPUT_PARAMETER", prepareParameter(executor,null,json));
ExecuteResult result =(ExecuteResult)service.eval(code.getSource(), "INPUT_PARAMETER", prepareParameter(executor,null,json));
return result;
}
@Override
public ResourceResult execute(Executor executor, String resourceCode, Integer version, ExecuteUnit wrapper, Map<String, Object> map) throws Exception {
SourceCode code = generator.generate(resourceCode,version,wrapper);
//if(log.isDebugEnabled()) {log.debug("generated groovy source code:\n{}",code.getSource());}
ResourceResult result =(ResourceResult)service.eval(code.getSource(), "INPUT_PARAMETER", prepareParameter(executor,null,map));
public ExecuteResult execute(Executor executor, String resourceCode, Integer version, ExecuteUnit wrapper, Map<String, Object> map) throws Exception {
SourceCode code =null;
if(StringUtils.hasText(wrapper.getSourceCode())){
code =new SourceCode();
code.setSource(wrapper.getSourceCode());
}else {
code = generator.generate(resourceCode,version,wrapper);
}
if(log.isDebugEnabled()) {log.debug("generated groovy source code:\n{}",code.getSource());}
ExecuteResult result =(ExecuteResult)service.eval(code.getSource(), "INPUT_PARAMETER", prepareParameter(executor,null,map));
return result;
}
@Override
public ResourceResult execute(Executor executor, String resourceCode, Integer version, ExecuteUnit wrapper, String subModelCode, String json) throws Exception {
SourceCode code = generator.generate(resourceCode,version,wrapper);
public ExecuteResult execute(Executor executor, String resourceCode, Integer version, ExecuteUnit wrapper, String subModelCode, String json) throws Exception {
SourceCode code =null;
if(StringUtils.hasText(wrapper.getSourceCode())){
code =new SourceCode();
code.setSource(wrapper.getSourceCode());
}else {
code = generator.generate(resourceCode,version,wrapper);
}
if(log.isDebugEnabled()) {log.debug("generated groovy source code:\n{}",code.getSource());}
ResourceResult result =(ResourceResult)service.eval(code.getSource(), "INPUT_PARAMETER", prepareParameter(executor,subModelCode,json));
ExecuteResult result =(ExecuteResult)service.eval(code.getSource(), "INPUT_PARAMETER", prepareParameter(executor,subModelCode,json));
return result;
}
@Override
public ResourceResult execute(Executor executor, String resourceCode, Integer version, ExecuteUnit wrapper, String subModelCode, Map<String, Object> map) throws Exception {
SourceCode code = generator.generate(resourceCode,version,wrapper);
public ExecuteResult execute(Executor executor, String resourceCode, Integer version, ExecuteUnit wrapper, String subModelCode, Map<String, Object> map) throws Exception {
SourceCode code =null;
if(StringUtils.hasText(wrapper.getSourceCode())){
code =new SourceCode();
code.setSource(wrapper.getSourceCode());
}else {
code = generator.generate(resourceCode,version,wrapper);
}
if(log.isDebugEnabled()) {log.debug("generated groovy source code:\n{}",code.getSource());}
ResourceResult result =(ResourceResult)service.eval(code.getSource(), "INPUT_PARAMETER", prepareParameter(executor,subModelCode,map));
ExecuteResult result =(ExecuteResult)service.eval(code.getSource(), "INPUT_PARAMETER", prepareParameter(executor,subModelCode,map));
return result;
}

74
io.sc.engine.rule.client/src/test/java/io/sc/engine/rule/client/test/Test.java

@ -5,8 +5,8 @@ import io.sc.engine.rule.client.ExecutorBuilder;
import io.sc.engine.rule.client.ExecutorFactory;
import io.sc.engine.rule.client.enums.ExecutorMode;
import io.sc.engine.rule.client.enums.LoaderMode;
import io.sc.engine.rule.core.ExecuteResult;
import io.sc.engine.rule.core.ParameterResult;
import io.sc.engine.rule.core.ResourceResult;
import io.sc.platform.util.TimeMonitor;
import java.util.HashMap;
@ -14,60 +14,32 @@ import java.util.List;
import java.util.Map;
public class Test {
private static final String MODEL_API_URL ="http://localhost:8080/api/re/resource"; //远程模型引擎 API URL 地址
private static final String EXECUTOR_NAME ="executor"; //执行器名称
private static final String MODEL_CODE ="M1628257024598"; //需要执行的模型代码
private static final Integer MODEL_VERSION =null; //需要执行的模型版本
private static final int COUNT =1; //需要执行的次数
private static final ExecutorMode executorMode =ExecutorMode.LOCAL; //执行器模式
private static final LoaderMode loaderMode =LoaderMode.REMOTE; //模型定义加载器模式
private static final String MODEL_API_URL ="http://localhost:8080"; //远程模型引擎 API URL 地址
private static final String MODEL_CODE ="M1734933657323"; //需要执行的模型代码
private static final Integer MODEL_VERSION =1; //需要执行的模型版本
private static final int COUNT =1; //需要执行的次数
private static TimeMonitor tracer =new TimeMonitor(); //创建一个时间跟踪器,用于跟踪执行时间,在生产环境中不要这样做
private static TimeMonitor tracer =new TimeMonitor(); //创建一个时间跟踪器,用于跟踪执行时间,在生产环境中不要这样做
public static void main(String[] args) throws Exception{
init();
testLocalExecutorRemoteLoader_map();
}
public static void init() throws Exception{
//创建执行器(本地执行,远程获取模型定义)
Executor executor =new ExecutorBuilder().build(ExecutorMode.LOCAL, LoaderMode.REMOTE, MODEL_API_URL);
//注册执行器,便于之后获取,如果每次都构建一个新的执行器,将显著影响性能
ExecutorFactory.register(EXECUTOR_NAME, executor);
//第一次执行,消除缓存对性能对比测试的影响
//executor.executeByCode(MODEL_CODE, MODEL_VERSION,JacksonObjectMapper.getDefaultObjectMapper().writeValueAsString(prepareData()));
ResourceResult result =executor.executeByCode(MODEL_CODE, MODEL_VERSION,prepareData());
List<ParameterResult> parameters =result.getData();
for(ParameterResult parameter : parameters) {
System.out.println(parameter);
}
//tracer.log("初始化完毕====================================");
}
/**
* 测试本地执行器,远程模型定义加载器,输入参数为 map 对象
* @throws Exception 违例
*/
public static void testLocalExecutorRemoteLoader_map() throws Exception{
//从注册器中获取执行器
Executor executor =ExecutorFactory.getExecutor(EXECUTOR_NAME);
tracer.info("开始执行(采用 map 对象作为参数)====================================");
for(int i=0;i<COUNT;i++) {
//准备执行的数据(输入参数)
Map<String,Object> data =prepareData();
//executor.getLoader().getResourceByCode(MODEL_CODE, MODEL_VERSION);
executor.executeByCode(MODEL_CODE, MODEL_VERSION,data);
Executor executor =new ExecutorBuilder().build(executorMode, loaderMode, MODEL_API_URL);
//准备模型参数
Map<String,Object> data =new HashMap<String,Object>();
data.put("P1734933744702", 0.03);//资产负债率(上期),小数
data.put("P1734933770426", 0.04);//资产负债率(本期),小数
//调用模型
tracer.info("starting executeByCode ...");
for (int i=0;i<COUNT;i++) {
ExecuteResult result =executor.executeByCode(MODEL_CODE, MODEL_VERSION,data);
List<ParameterResult> parameters =result.getData();
for(ParameterResult parameter : parameters) {
//System.out.println(parameter);
}
}
tracer.info("执行完毕(采用 map 对象作为参数)");
tracer.info("采用 map 对象作为输入参数将执行效率提高 20+ 倍!!!");
}
private static Map<String,Object> prepareData() throws Exception{
Map<String,Object> map =new HashMap<String,Object>();
map.put("P1628257063367", 10);//得分,整数
return map;
tracer.info("end executeByCode.");
}
}

12
io.sc.engine.rule.client/src/test/resources/logback-test.xml

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="info">
<appender-ref ref="STDOUT" />
</root>
</configuration>

100
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/ResourceResult.java

@ -1,100 +0,0 @@
package io.sc.engine.rule.core;
import com.fasterxml.jackson.core.JsonProcessingException;
import io.sc.engine.rule.core.enums.ParameterType;
import io.sc.platform.util.ObjectMapperUtil;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
/**
* 模型结果
* @author wangshaoping
*
*/
public class ResourceResult {
private int status;
private ValidateResult validateResult;
private List<ParameterResult> data =new ArrayList<ParameterResult>();
/**
* 添加结果参数
* @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<ParameterResult> getData() {
return data;
}
public void setData(List<ParameterResult> data) {
this.data = data;
}
public void addParameterResult(ParameterResult result) {
this.data.add(result);
}
@Override
public String toString() {
try {
return ObjectMapperUtil.json().writeValueAsString(this);
} catch (JsonProcessingException e) {
return "ResourceResult [status=" + status + ", validateResult=" + validateResult + ", data=" + data + "]";
}
}
}

11
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/ExecuteUnit.java

@ -15,12 +15,21 @@ import java.util.List;
@JsonSubTypes.Type(value=ExecuteUnit4Lib.class)
})
public abstract class ExecuteUnit {
protected String sourceCode; //源代码
protected List<Dictionary> dictionaries;//元数据
protected List<Function> functions; //自定义函数
protected List<Function> functions; //自定义函数
public abstract String getType();
public abstract void optimize();
public String getSourceCode() {
return sourceCode;
}
public void setSourceCode(String sourceCode) {
this.sourceCode = sourceCode;
}
public List<Dictionary> getDictionaries() {
return dictionaries;
}

2
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/code/ExecuteUnit4Resource.java

@ -43,7 +43,7 @@ public class ExecuteUnit4Resource extends ExecuteUnit{
}
public void optimize(){
//optimizeLibs();
optimizeLibs();
}
private void optimizeLibs(){

1
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/enums/ModelCategory.java

@ -5,7 +5,6 @@ package io.sc.engine.rule.core.enums;
*/
public enum ModelCategory {
QUANTITATIVE, //定量模型
QUANTITATIVE_INPUT, // 定量模型(输入)
QUALITATIVE, //定性模型
ADJUSTMENT, //调整项模型
RULE, //规则

6
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/enums/ParameterPropertiesName.java

@ -0,0 +1,6 @@
package io.sc.engine.rule.core.enums;
public enum ParameterPropertiesName {
SHOW_IF, // 是否可现实
MODIFY_IF; // 是否可修改
}

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

@ -9,6 +9,7 @@ import io.sc.engine.rule.core.po.model.parameter.*;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.PROPERTY, property="type",defaultImpl=InParameter.class)
@JsonSubTypes({
@ -24,6 +25,7 @@ public abstract class Parameter {
protected String id;//ID,主键
protected String code;//代码
protected String name;//名称
protected String alias;//别名
protected String description;//描述
protected String valueType;//参数值类型
protected Integer valueTypeVersion;//参数值类型版本号
@ -32,7 +34,8 @@ public abstract class Parameter {
protected Boolean valueTypeIsList;//参数值类型是否是列表
protected String defaultValue;//默认值
protected Integer order;//排序
protected String showIf;//显示条件
protected Boolean persistentAsIndicator;//是否作为指标存储
protected String properties;//属性
protected List<ParameterValidator> validators =new ArrayList<>();//包含的验证器
protected List<ParameterProcessor> processors =new ArrayList<>();//包含的处理器
@ -57,6 +60,12 @@ public abstract class Parameter {
public void setName(String name) {
this.name = name;
}
public String getAlias() {
return alias;
}
public void setAlias(String alias) {
this.alias = alias;
}
public String getDescription() {
return description;
}
@ -105,11 +114,17 @@ public abstract class Parameter {
public void setOrder(Integer order) {
this.order = order;
}
public String getShowIf() {
return showIf;
public Boolean getPersistentAsIndicator() {
return persistentAsIndicator;
}
public void setPersistentAsIndicator(Boolean persistentAsIndicator) {
this.persistentAsIndicator = persistentAsIndicator;
}
public String getProperties() {
return properties;
}
public void setShowIf(String showIf) {
this.showIf = showIf;
public void setProperties(String properties) {
this.properties = properties;
}
public List<ParameterValidator> getValidators() {
return validators;

18
io.sc.engine.rule.core/src/main/java/io/sc/engine/rule/core/po/resource/ModelResource.java

@ -12,8 +12,10 @@ import java.util.Date;
@JsonIgnoreProperties(ignoreUnknown=true)
public class ModelResource extends Resource {
private Model model;
protected Date effectiveDate; //生效日期
protected String imports; //imports
protected Date effectiveDate; //生效日期
protected String imports; //imports
protected String sourceCode; // 源代码
protected Date sourceCodeGenerateDate; // 源代码生成日期
public Model getModel() {
return model;
@ -33,6 +35,18 @@ public class ModelResource extends Resource {
public void setImports(String imports) {
this.imports = imports;
}
public String getSourceCode() {
return sourceCode;
}
public void setSourceCode(String sourceCode) {
this.sourceCode = sourceCode;
}
public Date getSourceCodeGenerateDate() {
return sourceCodeGenerateDate;
}
public void setSourceCodeGenerateDate(Date sourceCodeGenerateDate) {
this.sourceCodeGenerateDate = sourceCodeGenerateDate;
}
@Override
public ResourceType getType() {

6
io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/argument_render.tpl

@ -28,8 +28,8 @@ class Argument {
#(tabs(ParameterGenerator.generateMergeParameterValueFromIndicatorLib(model.getAllParameters()),2))
}
public ResourceResult toResult(){
ResourceResult result =new ResourceResult();
public ExecuteResult toResult(){
ExecuteResult result =new ExecuteResult();
#(tabs(ParameterGenerator.generateToResult(model.getAllParameters()),2))
return result;
}
@ -40,7 +40,7 @@ class Argument {
return map;
}
public void mergeResult(ResourceResult result){
public void mergeResult(ExecuteResult result){
if(result!=null){
#(tabs(ParameterGenerator.generateMergeResult(model.getAllParameters()),3))
}

10
io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/impl/resource.tpl

@ -45,7 +45,7 @@ class #(className(resource.code,resource.version)) {
* @param map 输入参数封装器
* @return 执行结果
*/
public static ResourceResult execute(Map<String,Object> map) throws Exception{
public static ExecuteResult execute(Map<String,Object> map) throws Exception{
return execute(map["executor"],map["subModelCode"],map["argument"]);
}
@ -56,7 +56,7 @@ class #(className(resource.code,resource.version)) {
* @param data 输入参数
* @return 执行结果
*/
public static ResourceResult execute(Executor executor,String subModelCode,Object data) throws Exception{
public static ExecuteResult execute(Executor executor,String subModelCode,Object data) throws Exception{
if(log.isDebugEnabled()){log.debug("开始执行: #(resource.name)");}
if(data instanceof Map){
if(log.isDebugEnabled()){log.debug("显示输入参数(Map)=================================================\n{}",ObjectMapperUtil.json().writeValueAsString(data));}
@ -85,7 +85,7 @@ class #(className(resource.code,resource.version)) {
#(varName(lib.code,lib.version)).validate(validateResult);
if(validateResult.hasError()){
if(log.isDebugEnabled()){log.debug("\t检查结果: 失败!");}
ResourceResult result =new ResourceResult();
ExecuteResult result =new ExecuteResult();
result.setValidateResult(validateResult);
return result;
}
@ -97,7 +97,7 @@ class #(className(resource.code,resource.version)) {
arg.validate(validateResult);
if(validateResult.hasError()){
if(log.isDebugEnabled()){log.debug("\t检查结果: 失败!");}
ResourceResult result =new ResourceResult();
ExecuteResult result =new ExecuteResult();
result.setValidateResult(validateResult);
return result;
}
@ -127,7 +127,7 @@ class #(className(resource.code,resource.version)) {
}
//返回结果
ResourceResult result =arg.toResult();
ExecuteResult result =arg.toResult();
if(log.isDebugEnabled()){log.debug("模型调用成功,返回结果:\n{}",ObjectMapperUtil.json().writeValueAsString(result));}
return result;
}

2
io.sc.engine.rule.core/src/main/resources/io/sc/engine/rule/core/code/template/import_render.tpl

@ -8,7 +8,7 @@ import io.sc.engine.rule.core.RuleSetResult;
import io.sc.engine.rule.core.SingleRuleResult;
import io.sc.engine.rule.core.FieldValidator;
import io.sc.engine.rule.core.ParameterResult;
import io.sc.engine.rule.core.ResourceResult;
import io.sc.engine.rule.core.ExecuteResult;
import io.sc.engine.rule.core.ValidateResult;
import io.sc.engine.rule.core.enums.ParameterType;
import io.sc.engine.rule.core.enums.RuntimeInputParameterType;

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

@ -9,7 +9,6 @@ io.sc.engine.rule.core.enums.ResourceType.SCORE_CARD=Score Card
# \u6A21\u578B\u5206\u7C7B\u679A\u4E3E
#================================================
io.sc.engine.rule.core.enums.ModelCategory.QUANTITATIVE=Quantitative
io.sc.engine.rule.core.enums.ModelCategory.QUANTITATIVE_INPUT=Quantitative(Input)
io.sc.engine.rule.core.enums.ModelCategory.QUALITATIVE=Qualitative
io.sc.engine.rule.core.enums.ModelCategory.ADJUSTMENT=Adjustment
io.sc.engine.rule.core.enums.ModelCategory.RULE=Rule
@ -31,6 +30,12 @@ io.sc.engine.rule.core.enums.DeployStatus.ON_LINE=OnLine
io.sc.engine.rule.core.enums.DeployStatus.OFF_LINE=OffLine
io.sc.engine.rule.core.enums.DeployStatus.APPROVING=Approving
#================================================
# \u53C2\u6570\u6269\u5C55\u5C5E\u6027\u540D
#================================================
io.sc.engine.rule.core.enums.ParameterPropertiesName.SHOW_IF=Show If
io.sc.engine.rule.core.enums.ParameterPropertiesName.MODIFY_IF=Modify If
#================================================
# \u53C2\u6570\u7C7B\u578B\u679A\u4E3E
#================================================

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

@ -9,7 +9,6 @@ io.sc.engine.rule.core.enums.ResourceType.SCORE_CARD=\u8A55\u5206\u5361
# \u6A21\u578B\u5206\u7C7B\u679A\u4E3E
#================================================
io.sc.engine.rule.core.enums.ModelCategory.QUANTITATIVE=\u5B9A\u91CF
io.sc.engine.rule.core.enums.ModelCategory.QUANTITATIVE_INPUT=\u5B9A\u91CF(\u8F38\u5165)
io.sc.engine.rule.core.enums.ModelCategory.QUALITATIVE=\u5B9A\u6027
io.sc.engine.rule.core.enums.ModelCategory.ADJUSTMENT=\u8ABF\u6574\u9805
io.sc.engine.rule.core.enums.ModelCategory.RULE=\u898F\u5247
@ -31,6 +30,12 @@ io.sc.engine.rule.core.enums.DeployStatus.ON_LINE=\u4E0A\u7DDA
io.sc.engine.rule.core.enums.DeployStatus.OFF_LINE=\u4E0B\u7DDA
io.sc.engine.rule.core.enums.DeployStatus.APPROVING=\u5BE9\u6279\u4E2D
#================================================
# \u53C2\u6570\u6269\u5C55\u5C5E\u6027\u540D
#================================================
io.sc.engine.rule.core.enums.ParameterPropertiesName.SHOW_IF=\u662F\u5426\u53EF\u663E\u793A
io.sc.engine.rule.core.enums.ParameterPropertiesName.MODIFY_IF=\u662F\u5426\u53EF\u4FEE\u6539
#================================================
# \u53C2\u6570\u7C7B\u578B\u679A\u4E3E
#================================================

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

@ -9,7 +9,6 @@ io.sc.engine.rule.core.enums.ResourceType.SCORE_CARD=\u8BC4\u5206\u5361
# \u6A21\u578B\u5206\u7C7B\u679A\u4E3E
#================================================
io.sc.engine.rule.core.enums.ModelCategory.QUANTITATIVE=\u5B9A\u91CF
io.sc.engine.rule.core.enums.ModelCategory.QUANTITATIVE_INPUT=\u5B9A\u91CF(\u8F93\u5165)
io.sc.engine.rule.core.enums.ModelCategory.QUALITATIVE=\u5B9A\u6027
io.sc.engine.rule.core.enums.ModelCategory.ADJUSTMENT=\u8C03\u6574\u9879
io.sc.engine.rule.core.enums.ModelCategory.RULE=\u89C4\u5219
@ -31,6 +30,12 @@ io.sc.engine.rule.core.enums.DeployStatus.ON_LINE=\u4E0A\u7EBF
io.sc.engine.rule.core.enums.DeployStatus.OFF_LINE=\u4E0B\u7EBF
io.sc.engine.rule.core.enums.DeployStatus.APPROVING=\u5BA1\u6279\u4E2D
#================================================
# \u53C2\u6570\u6269\u5C55\u5C5E\u6027\u540D
#================================================
io.sc.engine.rule.core.enums.ParameterPropertiesName.SHOW_IF=\u662F\u5426\u663E\u793A
io.sc.engine.rule.core.enums.ParameterPropertiesName.MODIFY_IF=\u662F\u5426\u53EF\u4FEE\u6539
#================================================
# \u53C2\u6570\u7C7B\u578B\u679A\u4E3E
#================================================

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

@ -17,6 +17,8 @@
"re.resources.grid.toolbar.deepCloneNew": "Deep Clone(new)",
"re.resources.grid.toolbar.deepCloneNew.tip": "Are you sure to deep clone the resource as new resource?",
"re.resources.grid.toolbar.design": "View/Design",
"re.resources.grid.toolbar.preDeploy": "Pre Deploy",
"re.resources.grid.toolbar.cancelPreDeploy": "Cancel Pre Deploy",
"re.resources.grid.toolbar.deploy.online": "Online",
"re.resources.grid.toolbar.deploy.online.tip": "Are you sure to on line the resource?",
"re.resources.grid.toolbar.deploy.offline": "Offline",
@ -26,6 +28,7 @@
"re.resources.grid.entity.effectiveDate": "Effective Date",
"re.resources.grid.entity.imports": "Imports",
"re.resources.grid.entity.preDeploy": "Pre Deploy",
"re.resources.grid.entity.taskName": "Task Name",
"re.resources.grid.entity.taskAssignee": "Task Assignee",
@ -76,7 +79,10 @@
"re.parameter.grid.entity.libCode": "Library",
"re.parameter.grid.entity.libVersion": "Library Version",
"re.parameter.grid.entity.indicatorCode": "Indicator",
"re.parameter.grid.entity.showIf": "Show If",
"re.parameter.grid.entity.persistentAsIndicator": "Persistent As Indicator",
"re.parameter.grid.entity.properties": "Extension Properties",
"re.parameter.grid.entity.property.name": "Property Name",
"re.parameter.grid.entity.property.value": "Property Value",
"re.parameter.tip.indicatorParameterCanNotEditable": "Indicator parameter can NOT editable!",
"re.parameter.tip.subModelParameterCanNotEditable": "Sub model parameter can NOT editable!",

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

@ -17,6 +17,8 @@
"re.resources.grid.toolbar.deepCloneNew": "深度複製(新)",
"re.resources.grid.toolbar.deepCloneNew.tip": "您確定要深度複製資源成一個新的資源嗎?",
"re.resources.grid.toolbar.design": "查看/設計",
"re.resources.grid.toolbar.preDeploy": "預發佈",
"re.resources.grid.toolbar.cancelPreDeploy": "取消預發佈",
"re.resources.grid.toolbar.deploy.online": "上線",
"re.resources.grid.toolbar.deploy.online.tip": "您確定要上線資源嗎?",
"re.resources.grid.toolbar.deploy.offline": "下線",
@ -26,6 +28,7 @@
"re.resources.grid.entity.effectiveDate": "生效日期",
"re.resources.grid.entity.imports": "外部引入",
"re.resources.grid.entity.preDeploy": "預發佈",
"re.resources.grid.entity.taskName": "任務名稱",
"re.resources.grid.entity.taskAssignee": "處理人",
@ -76,7 +79,10 @@
"re.parameter.grid.entity.libCode": "指標庫",
"re.parameter.grid.entity.libVersion": "指標庫版本",
"re.parameter.grid.entity.indicatorCode": "指標",
"re.parameter.grid.entity.showIf": "前端顯示條件",
"re.parameter.grid.entity.persistentAsIndicator": "是否作為指標存儲",
"re.parameter.grid.entity.properties": "擴展屬性",
"re.parameter.grid.entity.property.name": "屬性名",
"re.parameter.grid.entity.property.value": "屬性值",
"re.parameter.tip.indicatorParameterCanNotEditable": "類型為指標的參數不能進行編輯!",
"re.parameter.tip.subModelParameterCanNotEditable": "子模型參數不能進行編輯!",

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

@ -17,6 +17,8 @@
"re.resources.grid.toolbar.deepCloneNew": "深度复制(新)",
"re.resources.grid.toolbar.deepCloneNew.tip": "您确定要深度复制资源成一个新的资源吗?",
"re.resources.grid.toolbar.design": "查看/设计",
"re.resources.grid.toolbar.preDeploy": "预发布",
"re.resources.grid.toolbar.cancelPreDeploy": "取消预发布",
"re.resources.grid.toolbar.deploy.online": "上线",
"re.resources.grid.toolbar.deploy.online.tip": "您确定要上线资源吗?",
"re.resources.grid.toolbar.deploy.offline": "下线",
@ -26,6 +28,7 @@
"re.resources.grid.entity.effectiveDate": "生效日期",
"re.resources.grid.entity.imports": "外部引入",
"re.resources.grid.entity.preDeploy": "预发布",
"re.resources.grid.entity.taskName": "任务名称",
"re.resources.grid.entity.taskAssignee": "处理人",
@ -76,7 +79,10 @@
"re.parameter.grid.entity.libCode": "指标库",
"re.parameter.grid.entity.libVersion": "指标库版本",
"re.parameter.grid.entity.indicatorCode": "指标",
"re.parameter.grid.entity.showIf": "前端显示条件",
"re.parameter.grid.entity.persistentAsIndicator": "是否作为指标存储",
"re.parameter.grid.entity.properties": "扩展属性",
"re.parameter.grid.entity.property.name": "属性名",
"re.parameter.grid.entity.property.value": "属性值",
"re.parameter.tip.indicatorParameterCanNotEditable": "类型为指标的参数不能进行编辑!",
"re.parameter.tip.subModelParameterCanNotEditable": "子模型参数不能进行编辑!",

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

@ -120,10 +120,37 @@
label: $t('deploy'),
icon: 'bi-balloon',
enableIf: (args: any) => {
return args.selected && args.selected.type !== 'FOLDER';
return args.selected;
},
click: undefined,
},
{
name: 'preDeploy',
label: $t('re.resources.grid.toolbar.preDeploy'),
icon: 'bi-code',
enableIf: (args: any) => {
return args.selected;
},
click: (args: any) => {
axios.post(Environment.apiContextPath('/api/re/resource/preDeploy/' + args.selected.id), {}, { loading: true }).then((response) => {
treeGridRef.updateLocalData(response.data);
});
},
},
{
name: 'cancelPreDeploy',
label: $t('re.resources.grid.toolbar.cancelPreDeploy'),
icon: 'bi-code',
enableIf: (args: any) => {
return args.selected;
},
click: (args: any) => {
axios.post(Environment.apiContextPath('/api/re/resource/cancelPreDeploy/' + args.selected.id), {}, { loading: true }).then((response) => {
treeGridRef.updateLocalData(response.data);
});
},
},
'separator',
{
name: 'online',
label: $t('re.resources.grid.toolbar.deploy.online'),
@ -272,6 +299,18 @@
align: 'center',
format: EngineEnums.DeployStatus.formater,
},
{
width: 60,
name: 'preDeploy',
label: $t('re.resources.grid.entity.preDeploy'),
align: 'center',
sortable: false,
format: (value) => {
if (value) {
return Formater.yesNo()(value);
}
},
},
{ width: 120, name: 'taskName', label: $t('re.resources.grid.entity.taskName'), sortable: false },
{ width: 80, name: 'taskAssignee', label: $t('re.resources.grid.entity.taskAssignee'), sortable: false },
{ width: 100, name: 'lastModifier', label: $t('lastModifier') },

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

@ -211,23 +211,92 @@
return 'INDICATOR' === args.form.getFieldValue('type');
},
},
{
name: 'alias',
label: $t('alias'),
type: 'w-text',
},
{ name: 'description', label: $t('description'), type: 'w-text' },
...valueTypeManager.getEditorFields(),
{ name: 'order', label: $t('order'), type: 'w-number', showIf: false },
{ name: 'persistentAsIndicator', label: $t('re.parameter.grid.entity.persistentAsIndicator'), type: 'w-checkbox', defaultValue: true },
{
name: 'showIf',
label: $t('re.parameter.grid.entity.showIf'),
type: 'w-code-mirror',
toolbar: false,
lang: 'java',
rows: 5,
placeholder: true,
lineWrap: true,
lineBreak: false,
autoCompletion: autoCompletionManager.autoCompletion(),
showIf: (args: any) => {
let type = args.form.getFieldValue('type');
return 'IN' == type || 'IN_OPTION' == type || 'INDICATOR' == type;
name: 'properties',
label: $t('re.parameter.grid.entity.properties'),
type: 'w-grid',
title: $t('re.parameter.grid.entity.properties'),
height: 200,
localMode: true,
dbClickOperation: 'edit',
autoFetchData: false,
denseBody: true,
dndMode: 'local',
pageable: false,
configButton: false,
toolbarConfigure: { noIcon: false },
toolbarActions: [
'add',
'clone',
'edit',
'remove',
'separator',
{
name: 'example',
label: $t('example'),
icon: 'bi-balloon',
click: (args: any) => {
const sampleData = [
{ name: 'SHOW_IF', value: '${变量名}<=0' },
{ name: 'MODIFY_IF', value: '${变量名}<=0' },
];
args.grid.setLocalData(sampleData);
},
},
],
columns: [
{
width: '30%',
name: 'name',
label: $t('re.parameter.grid.entity.property.name'),
format: EngineEnums.ParameterPropertiesName.formater,
},
{
width: '70%',
name: 'value',
label: $t('re.parameter.grid.entity.property.value'),
sortable: false,
format: (value: any) => {
return PlaceHolder.replace(value);
},
},
],
editor: {
dialog: {
width: '600px',
},
form: {
colsNum: 1,
fields: [
{
name: 'name',
label: $t('re.parameter.grid.entity.property.name'),
type: 'w-select',
options: EngineEnums.ParameterPropertiesName.options,
},
{
name: 'value',
label: $t('re.parameter.grid.entity.property.value'),
type: 'w-code-mirror',
toolbar: false,
lang: 'java',
rows: 4,
lineWrap: true,
lineBreak: false,
placeholder: true,
autoCompletion: autoCompletionManager.autoCompletion(),
},
],
},
},
},
],
@ -248,7 +317,7 @@
{ name: 'indicatorCode', label: $t('re.parameter.grid.entity.indicatorCode') },
...valueTypeManager.getViewerFields(),
{ name: 'order', label: $t('order') },
{ name: 'showIf', label: $t('re.parameter.grid.entity.showIf') },
{ name: 'properties', label: $t('re.parameter.grid.entity.properties') },
...CorporationAuditorEntityManager.getViewerFields(),
],
},
@ -261,12 +330,38 @@
@before-request-data="
(args) => {
emit('beforeRequestData');
autoCompletionManager.load(Environment.apiContextPath('/api/re/common/parameterAndValueType/findInParameterByResourceId/' + resource.id));
}
"
@before-editor-data-submit="
(args: any) => {
const grid = args.grid.getEditorForm().getFieldComponent('properties');
const localData: any[] = grid.getRows();
const properties: any = [];
localData.forEach((item) => {
properties.push({ name: item.name, value: item.value });
});
args.data.properties = Tools.object2Json(properties);
}
"
@after-editor-open="
(args: any) => {
valueTypeManager.afterEditorOpen(args);
autoCompletionManager.load(Environment.apiContextPath('/api/re/common/parameterAndValueType/findInParameterByResourceId/' + resource.id));
const form = args.grid.getEditorForm();
const grid = form.getFieldComponent('properties');
switch (form.getStatus()) {
case 'add': //
grid.setLocalData([]);
break;
case 'edit': // /
case 'clone':
nextTick(() => {
const data = Tools.json2Object(args.data.properties);
grid.setLocalData(data);
});
break;
}
}
"
></w-grid>
@ -310,6 +405,9 @@ import { LibManager } from '@/views/shared/LibManager';
import { TemplateImportAndExportManager } from '@/views/shared/TemplateImportAndExportManager';
import { EngineEnums } from '@/views/shared/enums/EngineEnums';
import { AutoCompletionManager } from '@/views/shared/AutoCompletionManager';
import { PlaceHolder } from '@/utils/PlaceHolder';
import { toRaw } from 'vue';
import { nextTick } from 'vue';
const props = defineProps({
resource: { type: Object, default: undefined },

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

@ -171,16 +171,12 @@ class AutoCompletionManager {
return null;
}
public getParameterOptions(): any {
const cache = {};
public getParameterOptions(prefix?: string): any {
const options: any[] = [];
Object.values(this.parameters).forEach((parameter: any) => {
const option = this.getOptionItem(parameter);
if (option) {
if (!cache[option.label]) {
cache[option.label] = option;
options.push(option);
}
if (option && (!prefix || option.label.includes(prefix))) {
options.push(option);
}
});
for (const option of options) {
@ -208,8 +204,8 @@ class AutoCompletionManager {
public autoCompletionParameters(to: any, matchedText?: any): any {
return {
from: to,
options: this.getParameterOptions(),
validFor: /(.*)?/,
options: this.getParameterOptions(matchedText),
validFor: /^(.*)?$/,
};
}
@ -254,19 +250,25 @@ class AutoCompletionManager {
return null;
}
const beforeText = beforeMatched.text || '';
if (beforeText.endsWith(' ')) {
//匹配所有参数
if (beforeText === '' || beforeText.endsWith(' ')) {
//如果当前光标位于首位或前面一个是空格, 则匹配所有参数
return this.autoCompletionParameters(beforeMatched.to);
} else if (beforeText.endsWith('.')) {
//匹配所有属性
//如果当前光标的前一个字符是'.', 则匹配所有属性
return this.autoCompletionProperties(beforeMatched.to, beforeText);
} else {
//匹配部分属性
//匹配过滤后的部分属性
const lastIndexOf = beforeText.lastIndexOf('.');
const matchedText = beforeText.substring(0, lastIndexOf + 1);
const subText = beforeText.substring(lastIndexOf + 1);
if (lastIndexOf > -1) {
// 匹配
return this.autoCompletionProperties(beforeMatched.to - subText.length, matchedText, subText);
} else {
const lastSpaceIndexOf = beforeText.lastIndexOf(' ');
const parameterText = beforeText.substring(lastSpaceIndexOf + 1);
//匹配所有参数
return this.autoCompletionParameters(beforeMatched.to - parameterText.length, parameterText);
}
}
}

3
io.sc.engine.rule.frontend/src/views/shared/enums/EngineEnums.ts

@ -15,6 +15,7 @@ class EngineEnums {
'io.sc.engine.rule.core.enums.IndicatorType',
'io.sc.engine.rule.core.enums.LibType',
'io.sc.engine.rule.core.enums.ModelCategory',
'io.sc.engine.rule.core.enums.ParameterPropertiesName',
'io.sc.engine.rule.core.enums.ParameterType',
'io.sc.engine.rule.core.enums.QualitativeAdditionComponentType',
'io.sc.engine.rule.core.enums.ProcessorType',
@ -34,6 +35,7 @@ class EngineEnums {
public static IndicatorType: any;
public static LibType: any;
public static ModelCategory: any;
public static ParameterPropertiesName: any;
public static ParameterType: any;
public static QualitativeAdditionComponentType: any;
public static ProcessorType: any;
@ -62,6 +64,7 @@ class EngineEnums {
EngineEnums.IndicatorType = EngineEnums.createEnum(Enums.IndicatorType);
EngineEnums.LibType = EngineEnums.createEnum(Enums.LibType);
EngineEnums.ModelCategory = EngineEnums.createEnum(Enums.ModelCategory);
EngineEnums.ParameterPropertiesName = EngineEnums.createEnum(Enums.ParameterPropertiesName);
EngineEnums.ParameterType = EngineEnums.createEnum(Enums.ParameterType);
EngineEnums.QualitativeAdditionComponentType = EngineEnums.createEnum(Enums.QualitativeAdditionComponentType);
EngineEnums.ProcessorType = EngineEnums.createEnum(Enums.ProcessorType);

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

@ -26,6 +26,9 @@ import io.sc.engine.rule.server.model.entity.parameter.OutParameterEntity;
import io.sc.engine.rule.server.model.service.ModelService;
import io.sc.engine.rule.server.model.service.ParameterProcessorService;
import io.sc.engine.rule.server.model.service.ParameterService;
import io.sc.engine.rule.server.resource.entity.ModelResourceEntity;
import io.sc.engine.rule.server.resource.entity.ResourceEntity;
import io.sc.platform.core.support.KeyValue;
import io.sc.platform.util.CollectionUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
@ -33,10 +36,7 @@ import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.lang.reflect.Field;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.*;
@Service("io.sc.engine.rule.server.common.service.impl.ParameterAndValueTypeServiceImpl")
public class ParameterAndValueTypeServiceImpl implements ParameterAndValueTypeService {
@ -147,7 +147,7 @@ public class ParameterAndValueTypeServiceImpl implements ParameterAndValueTypeSe
return null;
}
private void buildByModel(ParameterAndValueType parameterAndValueType, ModelEntity modelEntity, Locale locale) throws Exception{
private void buildByModelXXX(ParameterAndValueType parameterAndValueType, ModelEntity modelEntity, Locale locale) throws Exception{
if(modelEntity==null || !StringUtils.hasText(modelEntity.getId())){ return; }
//枚举类型
@ -184,6 +184,7 @@ public class ParameterAndValueTypeServiceImpl implements ParameterAndValueTypeSe
buildValueType(parameterAndValueType,entity.getValueType(),entity.getValueTypeVersion(),locale);
}
}
//父模型参数
ModelEntity parentModelEntity =modelEntity.getParent();
while(parentModelEntity!=null){
@ -213,6 +214,100 @@ public class ParameterAndValueTypeServiceImpl implements ParameterAndValueTypeSe
}
}
private void buildByModel(ParameterAndValueType parameterAndValueType, ModelEntity modelEntity, Locale locale) throws Exception{
if(modelEntity==null || !StringUtils.hasText(modelEntity.getId())){ return; }
//枚举类型
buildByEnumDictionary(parameterAndValueType,locale);
//查找根模型
ModelEntity rootModelEntity =modelEntity;
ModelEntity parentModelEntity =modelEntity.getParent();
while(parentModelEntity!=null){
rootModelEntity =parentModelEntity;
parentModelEntity =parentModelEntity.getParent();
}
KeyValue<String,Boolean> flag =new KeyValue<>("sourceDone",false);
//深度优先递归遍历
buildByRootModel2(parameterAndValueType,modelEntity,rootModelEntity,flag,locale);
}
private void buildByRootModel2(
ParameterAndValueType parameterAndValueType,
ModelEntity sourceModelEntity, /* 模型实体(发起源) */
ModelEntity currentModelEntity, /* 模型实体(当前递归) */
KeyValue<String,Boolean> flag, /* 是否已经过了模型实体(发起源) */
Locale locale
) throws Exception {
if(sourceModelEntity.getId().equals(currentModelEntity.getId())){//遍历到当前模型
buildByModelParameters(parameterAndValueType,currentModelEntity,locale,ParameterType.IN_SUB_OUT);
buildByModelParameters(parameterAndValueType,currentModelEntity,locale,ParameterType.CONSTANT);
buildByModelParameters(parameterAndValueType,currentModelEntity,locale,ParameterType.IN_OPTION);
buildByModelParameters(parameterAndValueType,currentModelEntity,locale,ParameterType.IN);
buildByModelParameters(parameterAndValueType,currentModelEntity,locale,ParameterType.INDICATOR);
buildByModelParameters(parameterAndValueType,currentModelEntity,locale,ParameterType.INTERMEDIATE);
buildByModelParameters(parameterAndValueType,currentModelEntity,locale,ParameterType.OUT);
flag.setValue(true);
return;
}
// 深度优先, 遍历孩子
for(ModelEntity entity : currentModelEntity.getChildren()){
buildByRootModel2(parameterAndValueType,sourceModelEntity,entity,flag,locale);
}
// 处理发起源后面的模型
if(flag.getValue()){//当前模型后面的模型
buildByModelParameters(parameterAndValueType,currentModelEntity,locale,ParameterType.CONSTANT);
buildByModelParameters(parameterAndValueType,currentModelEntity,locale,ParameterType.IN_OPTION);
buildByModelParameters(parameterAndValueType,currentModelEntity,locale,ParameterType.IN);
buildByModelParameters(parameterAndValueType,currentModelEntity,locale,ParameterType.INDICATOR);
}else{//处理发起源前面的模型
buildByModelParameters(parameterAndValueType,currentModelEntity,locale,ParameterType.CONSTANT);
buildByModelParameters(parameterAndValueType,currentModelEntity,locale,ParameterType.IN_OPTION);
buildByModelParameters(parameterAndValueType,currentModelEntity,locale,ParameterType.IN);
buildByModelParameters(parameterAndValueType,currentModelEntity,locale,ParameterType.INDICATOR);
buildByModelParameters(parameterAndValueType,currentModelEntity,locale,ParameterType.INTERMEDIATE);
buildByModelParameters(parameterAndValueType,currentModelEntity,locale,ParameterType.OUT);
}
}
//根据指定类型构建模型参数
private void buildByModelParameters(ParameterAndValueType parameterAndValueType,ModelEntity modelEntity,Locale locale,ParameterType parameterType) throws Exception {
if(ParameterType.IN_SUB_OUT.equals(parameterType)){
List<OutParameterEntity> subModelOutParameters =parameterService.findOutParameterEntitiesOfSubModels(modelEntity.getId());
if(subModelOutParameters!=null && subModelOutParameters.size()>0) {
for(OutParameterEntity entity : subModelOutParameters) {
Parameter parameter =new Parameter();
parameter.setCode(entity.getCode());
parameter.setName(entity.getName());
parameter.setType(ParameterType.IN_SUB_OUT.toString());
parameter.setValueType(entity.getValueType());
parameter.setValueTypeVersion(entity.getValueTypeVersion());
parameter.setValueTypeIsList(entity.getValueTypeIsList());
parameterAndValueType.addParameter(parameter);
buildValueType(parameterAndValueType,entity.getValueType(),entity.getValueTypeVersion(),locale);
}
}
}else {
List<ParameterEntity> parameterEntities = modelEntity.getParameters();
if (parameterEntities != null && parameterEntities.size() > 0) {
for (ParameterEntity entity : parameterEntities) {
if (entity.getType().equals(parameterType)) {
Parameter parameter = new Parameter();
parameter.setCode(entity.getCode());
parameter.setName(entity.getName());
parameter.setType(entity.getType().toString());
parameter.setValueType(entity.getValueType());
parameter.setValueTypeVersion(entity.getValueTypeVersion());
parameter.setValueTypeIsList(entity.getValueTypeIsList());
parameterAndValueType.addParameter(parameter);
buildValueType(parameterAndValueType, entity.getValueType(), entity.getValueTypeVersion(), locale);
}
}
}
}
}
private void buildByLib(ParameterAndValueType parameterAndValueType,IndicatorLibEntity indicatorLibEntity, Locale locale) throws Exception{
if(indicatorLibEntity==null){ return; }
//枚举类型

49
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/executable/controller/ExecuteUnitWebController.java

@ -1,10 +1,10 @@
package io.sc.engine.rule.server.executable.controller;
import io.sc.engine.rule.client.spring.service.ExecutorFactoryService;
import io.sc.engine.rule.core.ExecuteResult;
import io.sc.engine.rule.core.code.ExecuteUnit;
import io.sc.engine.rule.core.code.SourceCode;
import io.sc.engine.rule.server.executable.service.ExecuteUnitService;
import io.sc.platform.core.annotation.IgnoreResponseBodyAdvice;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@ -19,48 +19,65 @@ import java.util.Map;
@RequestMapping("/api/re/executable")
public class ExecuteUnitWebController {
private static final Logger log =LoggerFactory.getLogger(ExecuteUnitWebController.class);
@Autowired private ExecuteUnitService executableUnitService;
@Autowired private ExecutorFactoryService executorFactoryService;
@Autowired private ExecuteUnitService service;
@GetMapping(value="findById/{unitId}")
@GetMapping(value={
"findById/{unitId}"
})
@IgnoreResponseBodyAdvice
public ExecuteUnit findById(
@PathVariable(name="unitId",required=true)String unitId
) throws Exception{
return executableUnitService.findById(unitId);
return service.findById(unitId,true);
}
@GetMapping(value="findByCodeAndVersion/{unitCode}/{unitVersion}")
public ExecuteUnit getLastModifyDateById(
@GetMapping(value={
"findByCodeAndVersion/{unitCode}",
"findByCodeAndVersion/{unitCode}/{unitVersion}"
})
@IgnoreResponseBodyAdvice
public ExecuteUnit findByCodeAndVersion(
@PathVariable(name="unitCode",required=true)String unitCode,
@PathVariable(name="unitVersion",required=false) Integer unitVersion
) throws Exception{
return executableUnitService.findByCodeAndVersion(unitCode,unitVersion);
return service.findByCodeAndVersion(unitCode,unitVersion,true);
}
@GetMapping(value="executeById/{unitId}/{subUnitCode}")
@PostMapping(value={
"executeById/{unitId}",
"executeById/{unitId}/{subUnitCode}"
})
@IgnoreResponseBodyAdvice
public ExecuteResult executeById(
@PathVariable(name="unitId",required=true)String unitId,
@PathVariable(name="subUnitCode",required=false)String subUnitCode
@PathVariable(name="subUnitCode",required=false)String subUnitCode,
@RequestBody String json
) throws Exception{
return executableUnitService.executeById(unitId,subUnitCode);
return service.executeById(unitId,subUnitCode,json);
}
@GetMapping(value="executeByCodeAndVersion/{unitCode}/{unitVersion}/{subUnitCode}")
@PostMapping(value={
"executeByCodeAndVersion/{unitCode}",
"executeByCodeAndVersion/{unitCode}/{unitVersion}",
"executeByCodeAndVersion/{unitCode}/{unitVersion}/{subUnitCode}"
})
@IgnoreResponseBodyAdvice
public ExecuteResult executeByCodeAndVersion(
@PathVariable(name="unitCode",required=true)String unitCode,
@PathVariable(name="unitVersion",required=false) Integer unitVersion,
@PathVariable(name="subUnitCode",required=false)String subUnitCode
@PathVariable(name="subUnitCode",required=false)String subUnitCode,
@RequestBody String json
) throws Exception{
return executableUnitService.executeByCodeAndVersion(unitCode,unitVersion,subUnitCode);
return service.executeByCodeAndVersion(unitCode,unitVersion,subUnitCode,json);
}
@PostMapping(value="generateGroovySourceCode/{unitId}")
public SourceCode generateGroovySourceCode(@PathVariable(name="unitId",required=true)String unitId) throws Exception{
return executableUnitService.generateGroovySourceCode(unitId);
return service.generateGroovySourceCode(unitId);
}
@PostMapping(value="validateGroovySourceCode")
public void validateGroovySourceCode(@RequestBody Map<String,String> body) throws Exception{
executableUnitService.validateGroovySourceCode(body.get("script"));
service.validateGroovySourceCode(body.get("script"));
}
}

14
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/executable/service/ExecuteUnitService.java

@ -2,13 +2,19 @@ package io.sc.engine.rule.server.executable.service;
import io.sc.engine.rule.core.ExecuteResult;
import io.sc.engine.rule.core.code.ExecuteUnit;
import io.sc.engine.rule.core.code.ExecuteUnit4Lib;
import io.sc.engine.rule.core.code.ExecuteUnit4Resource;
import io.sc.engine.rule.core.code.SourceCode;
import io.sc.engine.rule.server.lib.entity.LibEntity;
import io.sc.engine.rule.server.resource.entity.ModelResourceEntity;
public interface ExecuteUnitService {
public ExecuteUnit findById(String unitId) throws Exception;
public ExecuteUnit findByCodeAndVersion(String unitCode, Integer unitVersion) throws Exception;
public ExecuteResult executeById(String unitId, String subUnitCode) throws Exception;
public ExecuteResult executeByCodeAndVersion(String unitCode, Integer unitVersion,String subUnitCode) throws Exception;
public ExecuteUnit findById(String unitId, boolean useCache) throws Exception;
public ExecuteUnit findByCodeAndVersion(String unitCode, Integer unitVersion, boolean useCache) throws Exception;
public ExecuteResult executeById(String unitId, String subUnitCode,String json) throws Exception;
public ExecuteResult executeByCodeAndVersion(String unitCode, Integer unitVersion,String subUnitCode,String json) throws Exception;
//public ExecuteUnit4Resource createExecuteUnit4Resource(ModelResourceEntity resourceEntity, boolean canCache) throws Exception;
//public ExecuteUnit4Lib createExecuteUnit4Lib(LibEntity libEntity, boolean canCache) throws Exception;
public SourceCode generateGroovySourceCode(String unitId) throws Exception;
public boolean validateGroovySourceCode(String script) throws Exception;
}

140
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/executable/service/impl/ExecuteUnitServiceImpl.java

@ -1,6 +1,7 @@
package io.sc.engine.rule.server.executable.service.impl;
import io.sc.engine.rule.client.runtime.impl.groovy.GroovyScriptExecutor;
import io.sc.engine.rule.client.runtime.impl.groovy.GroovyScriptEngineService;
import io.sc.engine.rule.client.runtime.impl.groovy.GroovyScriptEngineServiceImpl;
import io.sc.engine.rule.client.spring.service.ExecutorFactoryService;
import io.sc.engine.rule.core.ExecuteResult;
import io.sc.engine.rule.core.code.ExecuteUnit;
@ -19,84 +20,99 @@ import io.sc.engine.rule.server.lib.converter.LibEntityConverter;
import io.sc.engine.rule.server.lib.entity.LibEntity;
import io.sc.engine.rule.server.lib.service.LibService;
import io.sc.engine.rule.server.resource.converter.ResourceEntityConverter;
import io.sc.engine.rule.server.resource.entity.ResourceEntity;
import io.sc.engine.rule.server.resource.entity.ModelResourceEntity;
import io.sc.engine.rule.server.resource.service.ResourceService;
import io.sc.platform.util.ObjectMapperUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.util.Date;
import java.util.List;
@Service("io.sc.engine.rule.server.executable.service.impl.ExecuteUnitServiceImpl")
public class ExecuteUnitServiceImpl implements ExecuteUnitService {
private static final Logger log = LoggerFactory.getLogger(ExecuteUnitServiceImpl.class);
@Autowired private ResourceService resourceService;
@Autowired private DictionaryService dictionaryService;
@Autowired private LibService libService;
@Autowired private FunctionService functionService;
@Autowired private ExecutorFactoryService executorFactoryService;
private GroovyScriptExecutor engine =new GroovyScriptExecutor();
@Override
public ExecuteUnit findById(String unitId) throws Exception {
public ExecuteUnit findById(String unitId, boolean useCache) throws Exception {
if(!StringUtils.hasText(unitId)){
return null;
}
// 先查找资源
ResourceEntity resourceEntity =resourceService.findById(unitId);
if(resourceEntity!=null){
List<DictionaryEntity> dictionaryEntities =dictionaryService.findDictionaryEntitiesByResourceId(resourceEntity.getId());
List<FunctionEntity> functionEntities =functionService.getRepository().findAll();
List<LibEntity> libEntities =libService.findByResourceId(resourceEntity.getId());
ExecuteUnit4Resource executeUnit =new ExecuteUnit4Resource();
executeUnit.setDictionaries(DictionaryEntityConverter.toPo(dictionaryEntities));
executeUnit.setFunctions(FunctionEntityConverter.toPo(functionEntities));
executeUnit.setResource(ResourceEntityConverter.toPo(resourceEntity,false));
executeUnit.setLibs(LibEntityConverter.toPo(libEntities));
executeUnit.getResource().setTestCases(null);//在获取定义时,不返回测试用例
executeUnit.optimize();
return executeUnit;
}
ModelResourceEntity resourceEntity =resourceService.getRepository().findModelResourceById(unitId);
ExecuteUnit4Resource executeUnit4Resource =createExecuteUnit4Resource(resourceEntity,useCache);
if(executeUnit4Resource!=null) { return executeUnit4Resource; }
// 再查找指标库
LibEntity libEntity =libService.findById(unitId);
if(libEntity!=null) {
List<DictionaryEntity> dictionaryEntities =dictionaryService.findDictionaryEntitiesByLibId(libEntity.getId());
List<FunctionEntity> functionEntities =functionService.getRepository().findAll();
ExecuteUnit4Lib executeUnit =new ExecuteUnit4Lib();
executeUnit.setDictionaries(DictionaryEntityConverter.toPo(dictionaryEntities));
executeUnit.setFunctions(FunctionEntityConverter.toPo(functionEntities));
executeUnit.setLib(LibEntityConverter.toPo(libEntity));
executeUnit.getLib().setTestCases(null);//在获取定义时,不返回测试用例
executeUnit.optimize();
return executeUnit;
}
ExecuteUnit4Lib executeUnit4Lib =createExecuteUnit4Lib(libEntity,useCache);
if(executeUnit4Lib!=null) { return executeUnit4Lib; }
return null;
}
@Override
public ExecuteUnit findByCodeAndVersion(String unitCode, Integer unitVersion) throws Exception {
public ExecuteUnit findByCodeAndVersion(String unitCode, Integer unitVersion, boolean useCache) throws Exception {
if(!StringUtils.hasText(unitCode)){
return null;
}
// 先查找资源
if(!StringUtils.hasText(unitCode)){ return null; }
ModelResourceEntity resourceEntity =null;
if(unitVersion==null){
List<ModelResourceEntity> resourceEntities =resourceService.getRepository().findModelResourceByCode(unitCode);
if(resourceEntities!=null && !resourceEntities.isEmpty()){
resourceEntity =resourceEntities.get(0);
}
}else{
resourceEntity =resourceService.getRepository().findModelResourceByCodeAndVersion(unitCode,unitVersion);
}
ExecuteUnit4Resource executeUnit4Resource =createExecuteUnit4Resource(resourceEntity,useCache);
if(executeUnit4Resource!=null) { return executeUnit4Resource; }
// 再查找指标库
LibEntity libEntity =null;
if(unitVersion==null){
List<LibEntity> libEntities =libService.getRepository().findByCodeOrderByVersionDesc(unitCode);
if(libEntities!=null && !libEntities.isEmpty()){
libEntity =libEntities.get(0);
}
}else{
libEntity =libService.getRepository().findByCodeAndVersion(unitCode,unitVersion);
}
ExecuteUnit4Lib executeUnit4Lib =createExecuteUnit4Lib(libEntity,true);
if(executeUnit4Lib!=null) { return executeUnit4Lib; }
return null;
}
@Override
public ExecuteResult executeById(String unitId, String subUnitCode) throws Exception {
return null;
public ExecuteResult executeById(String unitId, String subUnitCode,String json) throws Exception {
if(StringUtils.hasText(subUnitCode)) {
return executorFactoryService.getServerExecutor().executeById(unitId, subUnitCode, json);
}else{
return executorFactoryService.getServerExecutor().executeById(unitId, json);
}
}
@Override
public ExecuteResult executeByCodeAndVersion(String unitCode, Integer unitVersion,String subUnitCode) throws Exception {
return null;
public ExecuteResult executeByCodeAndVersion(String unitCode, Integer unitVersion,String subUnitCode,String json) throws Exception {
if(StringUtils.hasText(subUnitCode)) {
return executorFactoryService.getServerExecutor().executeByCode(unitCode, unitVersion, subUnitCode, json);
}else{
return executorFactoryService.getServerExecutor().executeByCode(unitCode, unitVersion, json);
}
}
@Override
public SourceCode generateGroovySourceCode(String unitId) throws Exception {
ExecuteUnit unit =findById(unitId);
ExecuteUnit unit =findById(unitId,false);
if(unit!=null) {
GroovySourceCodeGenerator generator = new GroovySourceCodeGenerator();
return generator.generate(unit);
@ -106,6 +122,46 @@ public class ExecuteUnitServiceImpl implements ExecuteUnitService {
@Override
public boolean validateGroovySourceCode(String script) throws Exception {
return engine.validate(script);
GroovyScriptEngineService engineService =new GroovyScriptEngineServiceImpl();
return engineService.validate(script);
}
private ExecuteUnit4Resource createExecuteUnit4Resource(ModelResourceEntity resourceEntity, boolean useCache) throws Exception {
if(resourceEntity==null) { return null; }
if(useCache) {
String cacheExecuteUnitString = resourceEntity.getCacheExecuteUnit();
if (cacheExecuteUnitString != null && !"".equals(cacheExecuteUnitString.trim())) {
return ObjectMapperUtil.json().readValue(cacheExecuteUnitString, ExecuteUnit4Resource.class);
}
}
List<DictionaryEntity> dictionaryEntities =dictionaryService.findDictionaryEntitiesByResourceId(resourceEntity.getId());
List<FunctionEntity> functionEntities =functionService.getRepository().findAll();
List<LibEntity> libEntities =libService.findByResourceId(resourceEntity.getId());
ExecuteUnit4Resource executeUnit =new ExecuteUnit4Resource();
executeUnit.setDictionaries(DictionaryEntityConverter.toPo(dictionaryEntities));
executeUnit.setFunctions(FunctionEntityConverter.toPo(functionEntities));
executeUnit.setResource(ResourceEntityConverter.toPo(resourceEntity,false));
executeUnit.setLibs(LibEntityConverter.toPo(libEntities));
executeUnit.getResource().setTestCases(null);//在获取定义时,不返回测试用例
executeUnit.optimize();
return executeUnit;
}
private ExecuteUnit4Lib createExecuteUnit4Lib(LibEntity libEntity, boolean useCache) throws Exception {
if(libEntity==null) { return null; }
List<DictionaryEntity> dictionaryEntities =dictionaryService.findDictionaryEntitiesByLibId(libEntity.getId());
List<FunctionEntity> functionEntities =functionService.getRepository().findAll();
ExecuteUnit4Lib executeUnit =new ExecuteUnit4Lib();
executeUnit.setDictionaries(DictionaryEntityConverter.toPo(dictionaryEntities));
executeUnit.setFunctions(FunctionEntityConverter.toPo(functionEntities));
executeUnit.setLib(LibEntityConverter.toPo(libEntity));
executeUnit.getLib().setTestCases(null);//在获取定义时,不返回测试用例
executeUnit.optimize();
return executeUnit;
}
}

1
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/lib/repository/LibRepository.java

@ -34,6 +34,7 @@ public interface LibRepository extends DaoRepository<LibEntity,String>{
public List<LibEntity> findByIdIn(Collection<String> ids);
public List<LibEntity> findByCode(String code);
public List<LibEntity> findByCodeOrderByVersion(String code);
public List<LibEntity> findByCodeOrderByVersionDesc(String code);
public List<LibEntity> findByCodeAndName(String code,String name);
public List<LibEntity> findByCodeOrName(String code,String name);
public LibEntity findByCodeAndVersion(String code,Integer version);

4
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/converter/ParameterEntityConverter.java

@ -50,6 +50,7 @@ public class ParameterEntityConverter {
po.setId(entity.getId());
po.setCode(entity.getCode());
po.setName(entity.getName());
po.setAlias(entity.getAlias());
po.setDescription(entity.getDescription());
po.setValueType(entity.getValueType());
po.setValueTypeVersion(entity.getValueTypeVersion());
@ -58,7 +59,8 @@ public class ParameterEntityConverter {
po.setValueTypeIsList(entity.getValueTypeIsList());
po.setDefaultValue(entity.getDefaultValue());
po.setOrder(entity.getOrder());
po.setShowIf(entity.getShowIf());
po.setPersistentAsIndicator(entity.getPersistentAsIndicator());
po.setProperties(entity.getProperties());
po.setValidators(ParameterValidatorEntityConverter.toPo(entity.getValidators()));
po.setProcessors(ParameterProcessorEntityConverter.toPo(entity.getProcessors()));
return po;

101
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/entity/ParameterEntity.java

@ -2,6 +2,8 @@ package io.sc.engine.rule.server.model.entity;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.core.type.TypeReference;
import io.sc.engine.rule.core.code.generator.impl.processor.ConditionRange;
import io.sc.engine.rule.core.enums.ParameterType;
import io.sc.engine.rule.core.enums.ReplaceMode;
import io.sc.engine.rule.server.common.CodeAndNameReplacer;
@ -14,15 +16,19 @@ import io.sc.engine.rule.server.testcase.annotation.TestCaseParameterAble;
import io.sc.engine.rule.server.testcase.wrapper.TestCaseParameterWrapper;
import io.sc.platform.orm.DeepClone;
import io.sc.platform.orm.IdClearable;
import io.sc.platform.orm.converter.MapStringConverter;
import io.sc.platform.orm.converter.NumericBooleanConverter;
import io.sc.platform.orm.entity.CorporationAuditorEntity;
import io.sc.platform.util.ObjectMapperUtil;
import org.hibernate.annotations.GenericGenerator;
import org.springframework.beans.BeanUtils;
import org.springframework.util.StringUtils;
import javax.persistence.*;
import javax.validation.constraints.Size;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
@ -63,6 +69,11 @@ public class ParameterEntity extends CorporationAuditorEntity<ParameterVo> imple
@Size(max=255)
protected String name;
//别名
@Column(name="ALIAS_", length=255)
@Size(max=255)
protected String alias;
//描述
@Column(name="DESCRIPTION_", length=255)
@Size(max=255)
@ -103,10 +114,14 @@ public class ParameterEntity extends CorporationAuditorEntity<ParameterVo> imple
@Column(name="ORDER_")
protected Integer order;
//条件
@Column(name="SHOW_IF_",length = 1024)
@Size(max=1024)
protected String showIf;
//是否作为指标存储
@Column(name="IS_PERSISTENT_AS_INDICATOR")
@Convert(converter= NumericBooleanConverter.class)
protected Boolean persistentAsIndicator;
//属性
@Column(name="PROPERTIES_")
protected String properties;
//所属模型
@ManyToOne(fetch=FetchType.LAZY)
@ -130,6 +145,7 @@ public class ParameterEntity extends CorporationAuditorEntity<ParameterVo> imple
vo.setId(this.getId());
vo.setCode(this.getCode());
vo.setName(this.getName());
vo.setAlias(this.getAlias());
vo.setDescription(this.getDescription());
vo.setType(this.getType());
vo.setValueType(this.getValueType());
@ -139,7 +155,8 @@ public class ParameterEntity extends CorporationAuditorEntity<ParameterVo> imple
vo.setValueTypeIsList(this.getValueTypeIsList());
vo.setDefaultValue(this.getDefaultValue());
vo.setOrder(this.getOrder());
vo.setShowIf(this.getShowIf());
vo.setPersistentAsIndicator(this.getPersistentAsIndicator());
vo.setProperties(this.getProperties());
vo.setModel(this.getModel()==null?null:this.getModel().getId());
}
}
@ -168,6 +185,14 @@ public class ParameterEntity extends CorporationAuditorEntity<ParameterVo> imple
this.name = name;
}
public String getAlias() {
return alias;
}
public void setAlias(String alias) {
this.alias = alias;
}
public String getDescription() {
return description;
}
@ -240,12 +265,20 @@ public class ParameterEntity extends CorporationAuditorEntity<ParameterVo> imple
this.order = order;
}
public @Size(max = 1024) String getShowIf() {
return showIf;
public Boolean getPersistentAsIndicator() {
return persistentAsIndicator;
}
public void setPersistentAsIndicator(Boolean persistentAsIndicator) {
this.persistentAsIndicator = persistentAsIndicator;
}
public void setShowIf(@Size(max = 1024) String showIf) {
this.showIf = showIf;
public String getProperties() {
return properties;
}
public void setProperties(String properties) {
this.properties = properties;
}
public ModelEntity getModel() {
@ -348,25 +381,63 @@ public class ParameterEntity extends CorporationAuditorEntity<ParameterVo> imple
@Override
public boolean replace(ParameterAndValueType parameterAndValueType, ReplaceMode mode) {
String replaced =parameterAndValueType.replace(this.showIf, mode);
String replaced =replaceJsonString(this.properties, parameterAndValueType, mode);
replaced =(replaced==null?"":replaced);
boolean result =false;
if(!replaced.equals(this.showIf)) {
if(!replaced.equals(this.properties)) {
result =true;
}
this.showIf =replaced;
this.properties =replaced;
return result;
}
@Override
public boolean replace(Map<String, String> code2codeMapping) {
String replaced = ParameterCodeReplacer.replace(this.showIf, code2codeMapping);
String replaced = ParameterCodeReplacer.replace(this.properties,code2codeMapping);
replaced =(replaced==null?"":replaced);
boolean result =false;
if(!replaced.equals(this.showIf)) {
if(!replaced.equals(this.properties)) {
result =true;
}
this.showIf =replaced;
this.properties =replaced;
return result;
}
private String replaceJsonString(String json, ParameterAndValueType parameterAndValueType, ReplaceMode mode) {
if(!StringUtils.hasText(json)){
return json;
}
try {
List<Property> properties = ObjectMapperUtil.json().readValue(json, new TypeReference<List<Property>>() {
});
for (Property property : properties) {
property.setValue(parameterAndValueType.replace(property.getValue(), mode));
}
return ObjectMapperUtil.json().writeValueAsString(properties);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
static class Property {
String name;
String value;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
}

34
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/vo/ParameterVo.java

@ -20,6 +20,9 @@ public class ParameterVo extends CorporationAuditorVo {
//名称
protected String name;
//别名
protected String alias;
//描述
protected String description;
@ -49,8 +52,11 @@ public class ParameterVo extends CorporationAuditorVo {
@Column(name="FD_ORDER")
protected Integer order;
//显示条件(主要为前端提供)
protected String showIf;
//是否作为指标存储
protected Boolean persistentAsIndicator;
//属性
protected String properties;
//所属模型
protected String model;
@ -79,6 +85,14 @@ public class ParameterVo extends CorporationAuditorVo {
this.name = name;
}
public String getAlias() {
return alias;
}
public void setAlias(String alias) {
this.alias = alias;
}
public String getDescription() {
return description;
}
@ -151,12 +165,20 @@ public class ParameterVo extends CorporationAuditorVo {
this.order = order;
}
public String getShowIf() {
return showIf;
public Boolean getPersistentAsIndicator() {
return persistentAsIndicator;
}
public void setPersistentAsIndicator(Boolean persistentAsIndicator) {
this.persistentAsIndicator = persistentAsIndicator;
}
public String getProperties() {
return properties;
}
public void setShowIf(String showIf) {
this.showIf = showIf;
public void setProperties(String properties) {
this.properties = properties;
}
public String getModel() {

197
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/resource/controller/ResourceWebController.java

@ -1,14 +1,7 @@
package io.sc.engine.rule.server.resource.controller;
import io.sc.engine.rule.client.runtime.impl.groovy.GroovyScriptEngineService;
import io.sc.engine.rule.client.runtime.impl.groovy.GroovyScriptEngineServiceImpl;
import io.sc.engine.rule.client.spring.service.ExecutorFactoryService;
import io.sc.engine.rule.core.ResourceAbstract;
import io.sc.engine.rule.core.ResourceResult;
import io.sc.engine.rule.core.code.ExecuteUnit;
import io.sc.engine.rule.core.code.SourceCode;
import io.sc.engine.rule.core.code.SourceCodeGenerator;
import io.sc.engine.rule.core.code.generator.GroovySourceCodeGenerator;
import io.sc.engine.rule.core.po.resource.Resource;
import io.sc.engine.rule.server.common.plugins.PluginManager;
import io.sc.engine.rule.server.common.plugins.item.ResourceExampleItem;
@ -54,98 +47,108 @@ public class ResourceWebController extends RestCrudController<ResourceVo, Resour
return list;
}
@GetMapping(value="getDefineById")
@IgnoreResponseBodyAdvice
public ExecuteUnit getDefineById(@RequestParam(name="id",required=true)String resourceId) throws Exception{
ExecuteUnit wrapper =service.getDefineById(resourceId);
return wrapper;
}
@GetMapping(value="getLastModifyDateById")
@IgnoreResponseBodyAdvice
public Long getLastModifyDateById(@RequestParam(name="id",required=true)String resourceId) throws Exception{
return service.getLastModifyDateById(resourceId);
}
@GetMapping(value="getDefineById2")
@IgnoreResponseBodyAdvice
public ExecuteUnit getDefineById2(@RequestParam(name="id",required=true)String resourceId) throws Exception{
ExecuteUnit wrapper =service.getDefineById2(resourceId);
return wrapper;
}
@GetMapping(value="getDefineByCode")
@IgnoreResponseBodyAdvice
public ExecuteUnit getDefineByCode(@RequestParam(name="code",required=true)String resourceCode,@RequestParam(name="version",required=false)Integer version) throws Exception{
ExecuteUnit wrapper =service.getDefineByCode(resourceCode, version);
return wrapper;
}
@GetMapping(value="getLastModifyDateByCode")
@IgnoreResponseBodyAdvice
public Long getLastModifyDateByCode(@RequestParam(name="code",required=true)String resourceCode,@RequestParam(name="version",required=false)Integer version) throws Exception{
return service.getLastModifyDateByCode(resourceCode,version);
}
@PostMapping(value="executeById")
@IgnoreResponseBodyAdvice
public ResourceResult executeById(
@RequestParam(name="resourceId") String resourceId,
@RequestParam(name="subModelCode",required=false) String subModelCode,
@RequestBody String json
) throws Exception{
if(StringUtils.hasText(subModelCode)) {
return executorFactoryService.getExecutor().executeById(resourceId, subModelCode, json);
}else {
return executorFactoryService.getExecutor().executeById(resourceId, json);
}
}
@PostMapping(value="executeByCode")
@IgnoreResponseBodyAdvice
public ResourceResult executeByCode(
@RequestParam(name="resourceCode") String resourceCode,
@RequestParam(name="version",required=false) Integer version,
@RequestParam(name="subModelCode",required=false) String subModelCode,
@RequestBody String json
) throws Exception{
if(StringUtils.hasText(subModelCode)) {
return executorFactoryService.getExecutor().executeByCode(resourceCode, version, subModelCode, json);
}else {
return executorFactoryService.getExecutor().executeByCode(resourceCode, version, json);
}
}
@PostMapping(value="generateGroovySourceCode/{resourceId}")
public SourceCode generateGroovySourceCode(@PathVariable(name="resourceId",required=true)String resourceId) throws Exception{
ExecuteUnit wrapper =getDefineById(resourceId);
SourceCodeGenerator generator =new GroovySourceCodeGenerator();
return generator.generate(null,wrapper);
}
@PostMapping(value="generateGroovySourceCodeForTest/{resourceId}")
public SourceCode generateGroovySourceCodeForTest(@PathVariable(name="resourceId",required=true)String resourceId) throws Exception{
ExecuteUnit wrapper =getDefineById(resourceId);
SourceCodeGenerator generator =new GroovySourceCodeGenerator();
return generator.generate(null,wrapper);
}
@PostMapping(value="sourceCodeValidate/{resourceId}")
public void sourceCodeValidate(@PathVariable(name="resourceId",required=true)String resourceId) throws Exception{
ExecuteUnit wrapper =getDefineById(resourceId);
SourceCodeGenerator generator =new GroovySourceCodeGenerator();
SourceCode sourceCode =generator.generate(resourceId,wrapper);
GroovyScriptEngineService engineService =new GroovyScriptEngineServiceImpl();
engineService.validate(sourceCode.getSource());
// @GetMapping(value="getDefineById")
// @IgnoreResponseBodyAdvice
// public ExecuteUnit getDefineById(@RequestParam(name="id",required=true)String resourceId) throws Exception{
// ExecuteUnit wrapper =service.getDefineById(resourceId);
// return wrapper;
// }
//
// @GetMapping(value="getLastModifyDateById")
// @IgnoreResponseBodyAdvice
// public Long getLastModifyDateById(@RequestParam(name="id",required=true)String resourceId) throws Exception{
// return service.getLastModifyDateById(resourceId);
// }
//
// @GetMapping(value="getDefineById2")
// @IgnoreResponseBodyAdvice
// public ExecuteUnit getDefineById2(@RequestParam(name="id",required=true)String resourceId) throws Exception{
// ExecuteUnit wrapper =service.getDefineById2(resourceId);
// return wrapper;
// }
//
// @GetMapping(value="getDefineByCode")
// @IgnoreResponseBodyAdvice
// public ExecuteUnit getDefineByCode(@RequestParam(name="code",required=true)String resourceCode,@RequestParam(name="version",required=false)Integer version) throws Exception{
// ExecuteUnit wrapper =service.getDefineByCode(resourceCode, version);
// return wrapper;
// }
//
// @GetMapping(value="getLastModifyDateByCode")
// @IgnoreResponseBodyAdvice
// public Long getLastModifyDateByCode(@RequestParam(name="code",required=true)String resourceCode,@RequestParam(name="version",required=false)Integer version) throws Exception{
// return service.getLastModifyDateByCode(resourceCode,version);
// }
//
// @PostMapping(value="executeById")
// @IgnoreResponseBodyAdvice
// public ResourceResult executeById(
// @RequestParam(name="resourceId") String resourceId,
// @RequestParam(name="subModelCode",required=false) String subModelCode,
// @RequestBody String json
// ) throws Exception{
// if(StringUtils.hasText(subModelCode)) {
// return executorFactoryService.getExecutor().executeById(resourceId, subModelCode, json);
// }else {
// return executorFactoryService.getExecutor().executeById(resourceId, json);
// }
// }
//
// @PostMapping(value="executeByCode")
// @IgnoreResponseBodyAdvice
// public ResourceResult executeByCode(
// @RequestParam(name="resourceCode") String resourceCode,
// @RequestParam(name="version",required=false) Integer version,
// @RequestParam(name="subModelCode",required=false) String subModelCode,
// @RequestBody String json
// ) throws Exception{
// if(StringUtils.hasText(subModelCode)) {
// return executorFactoryService.getExecutor().executeByCode(resourceCode, version, subModelCode, json);
// }else {
// return executorFactoryService.getExecutor().executeByCode(resourceCode, version, json);
// }
// }
//
// @PostMapping(value="generateGroovySourceCode/{resourceId}")
// public SourceCode generateGroovySourceCode(@PathVariable(name="resourceId",required=true)String resourceId) throws Exception{
// ExecuteUnit wrapper =getDefineById(resourceId);
// SourceCodeGenerator generator =new GroovySourceCodeGenerator();
// return generator.generate(null,wrapper);
// }
//
// @PostMapping(value="generateGroovySourceCodeForTest/{resourceId}")
// public SourceCode generateGroovySourceCodeForTest(@PathVariable(name="resourceId",required=true)String resourceId) throws Exception{
// ExecuteUnit wrapper =getDefineById(resourceId);
// SourceCodeGenerator generator =new GroovySourceCodeGenerator();
// return generator.generate(null,wrapper);
// }
//
// @PostMapping(value="sourceCodeValidate/{resourceId}")
// public void sourceCodeValidate(@PathVariable(name="resourceId",required=true)String resourceId) throws Exception{
// ExecuteUnit wrapper =getDefineById(resourceId);
// SourceCodeGenerator generator =new GroovySourceCodeGenerator();
// SourceCode sourceCode =generator.generate(resourceId,wrapper);
// GroovyScriptEngineService engineService =new GroovyScriptEngineServiceImpl();
// engineService.validate(sourceCode.getSource());
// }
//
// @PostMapping(value="sourceCodeValidateForTest/{resourceId}")
// public void sourceCodeValidateForTest(@PathVariable(name="resourceId",required=true)String resourceId) throws Exception{
// ExecuteUnit wrapper =getDefineById(resourceId);
// SourceCodeGenerator generator =new GroovySourceCodeGenerator();
// SourceCode sourceCode =generator.generate(resourceId,wrapper);
// GroovyScriptEngineService engineService =new GroovyScriptEngineServiceImpl();
// engineService.validate(sourceCode.getSource());
// }
//
@PostMapping(value="preDeploy/{resourceId}")
public List<ResourceVo> preDeploy(@PathVariable(name="resourceId",required=true)String resourceId) throws Exception{
return service.preDeploy(resourceId);
}
@PostMapping(value="sourceCodeValidateForTest/{resourceId}")
public void sourceCodeValidateForTest(@PathVariable(name="resourceId",required=true)String resourceId) throws Exception{
ExecuteUnit wrapper =getDefineById(resourceId);
SourceCodeGenerator generator =new GroovySourceCodeGenerator();
SourceCode sourceCode =generator.generate(resourceId,wrapper);
GroovyScriptEngineService engineService =new GroovyScriptEngineServiceImpl();
engineService.validate(sourceCode.getSource());
@PostMapping(value="cancelPreDeploy/{resourceId}")
public List<ResourceVo> cancelPreDeploy(@PathVariable(name="resourceId",required=true)String resourceId) throws Exception{
return service.cancelPreDeploy(resourceId);
}
/**

12
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/resource/entity/ModelResourceEntity.java

@ -5,6 +5,7 @@ import io.sc.engine.rule.core.enums.ResourceType;
import io.sc.engine.rule.server.model.entity.ModelEntity;
import io.sc.engine.rule.server.resource.vo.ModelResourceVo;
import org.springframework.beans.BeanUtils;
import org.springframework.util.StringUtils;
import javax.persistence.*;
import java.util.Date;
@ -29,6 +30,10 @@ public class ModelResourceEntity extends ResourceEntity {
@Column(name="IMPORTS_")
protected String imports;
//缓存的执行部件
@Column(name="CACHE_EXECUTE_UNIT_")
protected String cacheExecuteUnit;
//附件个数
@Transient
protected int attachmentCount;
@ -51,6 +56,7 @@ public class ModelResourceEntity extends ResourceEntity {
vo.setVersion(this.getVersion());
vo.setEffectiveDate(this.getEffectiveDate());
vo.setImports(this.getImports());
vo.setPreDeploy(StringUtils.hasText(this.cacheExecuteUnit));
vo.setAttachmentCount(this.getAttachmentCount());
vo.setTaskName(this.getTaskName());
vo.setTaskAssignee(this.getTaskAssignee());
@ -84,6 +90,12 @@ public class ModelResourceEntity extends ResourceEntity {
public void setImports(String imports) {
this.imports = imports;
}
public String getCacheExecuteUnit() {
return cacheExecuteUnit;
}
public void setCacheExecuteUnit(String cacheExecuteUnit) {
this.cacheExecuteUnit = cacheExecuteUnit;
}
public int getAttachmentCount() {
return attachmentCount;
}

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

@ -31,9 +31,18 @@ public interface ResourceRepository extends DaoRepository<ResourceEntity,String>
@Query("select e from io.sc.engine.rule.server.resource.entity.ModelResourceEntity e where e.id=:id")
public ModelResourceEntity findModelResourceById(@Param("id") String id);
@Query("select e from io.sc.engine.rule.server.resource.entity.ModelResourceEntity e where e.code=:code and e.version=:version")
public ModelResourceEntity findModelResourceByCodeAndVersion(@Param("code") String code,@Param("version") Integer version);
@Query("select e from io.sc.engine.rule.server.resource.entity.ModelResourceEntity e where e.code=:code order by e.version desc")
public List<ModelResourceEntity> findModelResourceByCode(@Param("code") String code);
@Query("select e from io.sc.engine.rule.server.resource.entity.ModelResourceEntity e order by e.namec")
public List<ModelResourceEntity> findAllModelResourceEntities();
@Query("select e from io.sc.engine.rule.server.resource.entity.ResourceEntity e where e.parent.id=:parentId")
public List<ResourceEntity> findByParentId(@Param("parentId") String parentId);
@Query("select e from io.sc.engine.rule.server.resource.entity.ResourceEntity e where concat(e.code,':',e.version) in (:codeAndVersions)")
public List<ResourceEntity> findByCodeAndVersions(@Param("codeAndVersions") Set<String> codeAndVersions);

54
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/resource/service/ResourceService.java

@ -25,48 +25,6 @@ public interface ResourceService extends DaoService<ResourceEntity, String, Reso
*/
public List<ResourceAbstract> getAllResourceAbstract() throws Exception;
/**
* 通过资源 ID 获取资源定义封装对象
* @param resourceId 资源ID
* @return 资源定义封装对象
* @throws Exception 违例
*/
public ExecuteUnit getDefineById(String resourceId) throws Exception;
/**
* 通过资源 ID 获取资源定义的最后修改日期
* @param resourceId 资源ID
* @return 最后修改日期
* @throws Exception 违例
*/
public Long getLastModifyDateById(String resourceId) throws Exception;
/**
* 通过资源ID获取资源定义封装对象
* @param resourceId 资源ID
* @return 资源定义封装对象
* @throws Exception 违例
*/
public ExecuteUnit getDefineById2(String resourceId) throws Exception;
/**
* 通过资源代码和版本获取资源定义封装对象
* @param resourceCode 资源代码
* @param version 资源版本
* @return 资源定义封装对象
* @throws Exception 违例
*/
public ExecuteUnit getDefineByCode(String resourceCode,Integer version) throws Exception;
/**
* 通过资源代码和版本获取资源定义的最后修改日期
* @param resourceCode 资源代码
* @param version 资源版本
* @return 最后修改日期
* @throws Exception 违例
*/
public Long getLastModifyDateByCode(String resourceCode,Integer version) throws Exception;
/**
* 深度克隆资源实体(不同版本)
* @param id 资源ID
@ -144,4 +102,16 @@ public interface ResourceService extends DaoService<ResourceEntity, String, Reso
* @throws Exception 违例
*/
public void updateResources(String roleId,Set<String> resourceIds) throws Exception;
/**
* 预发布
* @param resourceId 资源ID
*/
public List<ResourceVo> preDeploy(String resourceId) throws Exception;
/**
* 取消预发布
* @param resourceId 资源ID
*/
public List<ResourceVo> cancelPreDeploy(String resourceId) throws Exception;
}

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

@ -1,10 +1,10 @@
package io.sc.engine.rule.server.resource.service.impl;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import io.sc.engine.rule.core.ResourceAbstract;
import io.sc.engine.rule.core.code.ExecuteUnit;
import io.sc.engine.rule.core.code.ExecuteUnit4Lib;
import io.sc.engine.rule.core.code.ExecuteUnit4Resource;
import io.sc.engine.rule.core.code.*;
import io.sc.engine.rule.core.code.generator.GroovySourceCodeGenerator;
import io.sc.engine.rule.core.enums.DeployStatus;
import io.sc.engine.rule.core.enums.ExecuteMode;
import io.sc.engine.rule.core.enums.ModelCategory;
@ -15,6 +15,7 @@ import io.sc.engine.rule.core.po.resource.Resource;
import io.sc.engine.rule.server.dictionary.converter.DictionaryEntityConverter;
import io.sc.engine.rule.server.dictionary.entity.DictionaryEntity;
import io.sc.engine.rule.server.dictionary.service.DictionaryService;
import io.sc.engine.rule.server.executable.service.ExecuteUnitService;
import io.sc.engine.rule.server.function.converter.FunctionEntityConverter;
import io.sc.engine.rule.server.function.entity.FunctionEntity;
import io.sc.engine.rule.server.function.service.FunctionService;
@ -27,6 +28,7 @@ import io.sc.engine.rule.server.model.service.ModelService;
import io.sc.engine.rule.server.common.plugins.PluginManager;
import io.sc.engine.rule.server.common.plugins.item.ResourceExampleItem;
import io.sc.engine.rule.server.resource.converter.ResourceEntityConverter;
import io.sc.engine.rule.server.resource.entity.FolderResourceEntity;
import io.sc.engine.rule.server.resource.entity.ModelResourceEntity;
import io.sc.engine.rule.server.resource.entity.ResourceEntity;
import io.sc.engine.rule.server.resource.repository.ResourceRepository;
@ -68,6 +70,7 @@ import java.util.*;
@Service("io.sc.engine.rule.server.resource.service.impl.ResourceServiceImpl")
public class ResourceServiceImpl extends DaoServiceImpl<ResourceEntity, String, ResourceRepository> implements ResourceService {
@Autowired private ApplicationContext applicationContext;
@Autowired private ExecuteUnitService executeUnitService;
@Autowired private SystemParameterService systemParameterService;
@Autowired private ModelService modelService;
@Autowired private DictionaryService dictionaryService;
@ -288,140 +291,6 @@ public class ResourceServiceImpl extends DaoServiceImpl<ResourceEntity, String,
return null;
}
@Override
public ExecuteUnit getDefineById(String resourceId) throws Exception {
if(StringUtils.hasText(resourceId)) {
//获取自定义函数
List<FunctionEntity> functionEntities =functionService.getRepository().findAll();
//先找资源
ResourceEntity resourceEntity =this.findById(resourceId);
if(resourceEntity!=null) {
// 获取指标库
List<LibEntity> libEntities =libService.findByResourceId(resourceEntity.getId());
// 获取元数据
List<DictionaryEntity> dictionaryEntities =dictionaryService.findDictionaryEntitiesByResourceId(resourceEntity.getId());
ExecuteUnit4Resource wrapper =new ExecuteUnit4Resource();
wrapper.setResource(ResourceEntityConverter.toPo(resourceEntity,false));
wrapper.getResource().setTestCases(null);//在获取定义时,不返回测试用例
wrapper.setDictionaries(DictionaryEntityConverter.toPo(dictionaryEntities));
wrapper.setLibs(LibEntityConverter.toPo(libEntities));
wrapper.setFunctions(FunctionEntityConverter.toPo(functionEntities));
wrapper.optimize();
return wrapper;
}
//再找指标库
LibEntity libEntity =libService.findById(resourceId);
if(libEntity!=null) {
List<DictionaryEntity> dictionaryEntities =dictionaryService.findDictionaryEntitiesByLibId(libEntity.getId());
ExecuteUnit4Lib wrapper =new ExecuteUnit4Lib();
wrapper.setDictionaries(DictionaryEntityConverter.toPo(dictionaryEntities));
wrapper.setLib(LibEntityConverter.toPo(libEntity));
wrapper.getLib().setTestCases(null);
wrapper.setFunctions(FunctionEntityConverter.toPo(functionEntities));
wrapper.optimize();
return wrapper;
}
}
return null;
}
@Override
public Long getLastModifyDateById(String resourceId) throws Exception {
if(StringUtils.hasText(resourceId)) {
//先找资源
ResourceEntity resourceEntity =this.findById(resourceId);
if(resourceEntity!=null) {
return resourceEntity.getLastModifyDate()==null?null:resourceEntity.getLastModifyDate().getTime();
}
//再找指标库
LibEntity libEntity =libService.findById(resourceId);
if(libEntity!=null) {
return libEntity.getLastModifyDate()==null?null:libEntity.getLastModifyDate().getTime();
}
}
return null;
}
@Override
public ExecuteUnit getDefineById2(String resourceId) throws Exception {
if(StringUtils.hasText(resourceId)) {
ExecuteUnit resourceWrapper =resourceQueryService.getResourceDefineById(resourceId);
if(resourceWrapper!=null) {
return resourceWrapper;
}
}
return null;
}
@Override
public ExecuteUnit getDefineByCode(String resourceCode, Integer version) throws Exception {
if(StringUtils.hasText(resourceCode)) {
//先找资源
ResourceEntity resourceEntity =null;
if(version!=null) {
resourceEntity =repository.findByCodeAndVersion(resourceCode, version);
}else {
String strategy =systemParameterService.getParameter("parameter.re.server.modelDefine.nullVersion.strategy");
if("last_deploy".equalsIgnoreCase(strategy)) {
resourceEntity =repository.findTopByCodeAndStatusOrderByVersionDesc(resourceCode, DeployStatus.ON_LINE);
}else {
resourceEntity =repository.findTopByCodeOrderByVersionDesc(resourceCode);
}
}
if(resourceEntity!=null) {
return getDefineById(resourceEntity.getId());
}else {
//再找指标库
LibEntity libEntity =null;
if(version!=null) {
libEntity =libService.getRepository().findByCodeAndVersion(resourceCode, version);
}else {
libEntity =libService.getRepository().findTopByCodeOrderByVersionDesc(resourceCode);
}
if(libEntity!=null) {
return getDefineById(libEntity.getId());
}
}
}
return null;
}
@Override
public Long getLastModifyDateByCode(String resourceCode, Integer version) throws Exception {
if(StringUtils.hasText(resourceCode)) {
//先找资源
ResourceEntity resourceEntity =null;
if(version!=null) {
resourceEntity =repository.findByCodeAndVersion(resourceCode, version);
}else {
String strategy =systemParameterService.getParameter("parameter.re.server.modelDefine.nullVersion.strategy");
if("last_deploy".equalsIgnoreCase(strategy)) {
resourceEntity =repository.findTopByCodeAndStatusOrderByVersionDesc(resourceCode, DeployStatus.ON_LINE);
}else {
resourceEntity =repository.findTopByCodeOrderByVersionDesc(resourceCode);
}
}
if(resourceEntity!=null) {
return resourceEntity.getLastModifyDate()==null?null:resourceEntity.getLastModifyDate().getTime();
}else {
//再找指标库
LibEntity libEntity =null;
if(version!=null) {
libEntity =libService.getRepository().findByCodeAndVersion(resourceCode, version);
}else {
libEntity =libService.getRepository().findTopByCodeOrderByVersionDesc(resourceCode);
}
if(libEntity!=null) {
return libEntity.getLastModifyDate()==null?null:libEntity.getLastModifyDate().getTime();
}
}
}
return null;
}
@Override
@Transactional
public void createExample(Set<String> contributionIds) throws Exception{
@ -556,6 +425,66 @@ public class ResourceServiceImpl extends DaoServiceImpl<ResourceEntity, String,
}
}
@Override
public List<ResourceVo> preDeploy(String resourceId) throws Exception {
List<ResourceVo> vos =new ArrayList<>();
recursionPreDeploy(resourceId,vos);
return vos;
}
@Override
public List<ResourceVo> cancelPreDeploy(String resourceId) throws Exception {
List<ResourceVo> vos =new ArrayList<>();
recursionCancelPreDeploy(resourceId,vos);
return vos;
}
private void recursionPreDeploy(String resourceId, List<ResourceVo> vos) throws Exception {
ResourceEntity resourceEntity =findById(resourceId);
if(resourceEntity instanceof FolderResourceEntity){
List<ResourceEntity> children =repository.findByParentId(resourceEntity.getId());
if(children!=null && !children.isEmpty()){
for(ResourceEntity child : children){
recursionPreDeploy(child.getId(),vos);
}
}
}else {
ExecuteUnit wrapper = executeUnitService.findById(resourceId, false);
if (wrapper == null) { return; }
SourceCode sourceCode = new GroovySourceCodeGenerator().generate(null, wrapper);
if (sourceCode == null) { return; }
wrapper.setSourceCode(sourceCode.getSource());
ResourceVo vo =doUpdateCacheExecuteUnit(resourceId, wrapper);
vos.add(vo);
}
}
@Transactional
private void recursionCancelPreDeploy(String resourceId, List<ResourceVo> vos) throws Exception {
ResourceEntity resourceEntity =findById(resourceId);
if(resourceEntity instanceof FolderResourceEntity){
List<ResourceEntity> children =repository.findByParentId(resourceEntity.getId());
if(children!=null && !children.isEmpty()){
for(ResourceEntity child : children){
recursionCancelPreDeploy(child.getId(),vos);
}
}
}else {
ModelResourceEntity entity =repository.findModelResourceById(resourceId);
if(entity==null) { return; }
entity.setCacheExecuteUnit(null);
vos.add(repository.save(entity).toVo());
}
}
@Transactional
private ResourceVo doUpdateCacheExecuteUnit(String resourceId,ExecuteUnit wrapper) throws JsonProcessingException {
ModelResourceEntity entity =repository.findModelResourceById(resourceId);
entity.setCacheExecuteUnit(ObjectMapperUtil.json().writeValueAsString(wrapper));
repository.save(entity);
return entity.toVo();
}
/**
* 检查约束条件约束条件规则如下:
*

9
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/resource/vo/ModelResourceVo.java

@ -19,6 +19,9 @@ public class ModelResourceVo extends ResourceVo {
//引入外部包
protected String imports;
//是否预发布
protected boolean preDeploy;
//附件个数
protected int attachmentCount;
@ -52,6 +55,12 @@ public class ModelResourceVo extends ResourceVo {
public void setImports(String imports) {
this.imports = imports;
}
public boolean isPreDeploy() {
return preDeploy;
}
public void setPreDeploy(boolean preDeploy) {
this.preDeploy = preDeploy;
}
public int getAttachmentCount() {
return attachmentCount;
}

21
io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/testcase/service/impl/TestCaseServiceImpl.java

@ -4,10 +4,7 @@ import io.sc.engine.rule.client.Executor;
import io.sc.engine.rule.client.runtime.impl.groovy.GroovyScriptEngineService;
import io.sc.engine.rule.client.runtime.impl.groovy.GroovyScriptEngineServiceImpl;
import io.sc.engine.rule.client.spring.service.ExecutorFactoryService;
import io.sc.engine.rule.core.ParameterResult;
import io.sc.engine.rule.core.ResourceResult;
import io.sc.engine.rule.core.ValidateField;
import io.sc.engine.rule.core.ValidateResult;
import io.sc.engine.rule.core.*;
import io.sc.engine.rule.core.code.ExecuteUnit;
import io.sc.engine.rule.core.code.ExecuteUnit4Resource;
import io.sc.engine.rule.core.code.SourceCode;
@ -506,7 +503,7 @@ public class TestCaseServiceImpl extends DaoServiceImpl<TestCaseEntity, String,
@Override
public void upload(HttpServletRequest request, HttpServletResponse response, MultipartFile multipartFile, Locale locale) throws Exception {
Executor executor =executorFactoryService.getExecutor();
Executor executor =executorFactoryService.getServerExecutor();
XSSFWorkbook workbook = new XSSFWorkbook(multipartFile.getInputStream());
XSSFSheet sheet = workbook.getSheetAt(0);
@ -604,7 +601,7 @@ public class TestCaseServiceImpl extends DaoServiceImpl<TestCaseEntity, String,
executeParameter.put("executor", executor);
executeParameter.put("subModelCode", null);
executeParameter.put("argument", parameters);
ResourceResult result =(ResourceResult)groovyScriptEngineService.eval(groovySourceCode.getSource(),"INPUT_PARAMETER",executeParameter);
ExecuteResult result =(ExecuteResult)groovyScriptEngineService.eval(groovySourceCode.getSource(),"INPUT_PARAMETER",executeParameter);
if(result!=null){
for(int i =2;i<names.size();i++) {
String name = names.get(i);
@ -648,9 +645,9 @@ public class TestCaseServiceImpl extends DaoServiceImpl<TestCaseEntity, String,
cache.put(parameter.getCode(), parameter);
map.put(parameter.getCode(), parameter.getInputValue());
}
Executor executor =executorFactoryService.getExecutor();
Executor executor =executorFactoryService.getServerExecutor();
if(executor!=null) {
ResourceResult result =executor.executeById(resourceEntity.getId(), map);
ExecuteResult result =executor.executeById(resourceEntity.getId(), map);
if(result!=null) {
ValidateResult validateResult =result.getValidateResult();
if(validateResult!=null && validateResult.hasError()){
@ -710,9 +707,9 @@ public class TestCaseServiceImpl extends DaoServiceImpl<TestCaseEntity, String,
cache.put(parameter.getCode(), parameter);
map.put(parameter.getCode(), parameter.getInputValue());
}
Executor executor =executorFactoryService.getExecutor();
Executor executor =executorFactoryService.getServerExecutor();
if(executor!=null) {
ResourceResult result =executor.executeById(resourceEntity.getId(), map);
ExecuteResult result =executor.executeById(resourceEntity.getId(), map);
if(result!=null) {
List<ParameterResult> datas =result.getData();
if(datas!=null && datas.size()>0) {
@ -767,9 +764,9 @@ public class TestCaseServiceImpl extends DaoServiceImpl<TestCaseEntity, String,
cache.put(parameter.getCode(), parameter);
map.put(parameter.getCode(), parameter.getInputValue());
}
Executor executor =executorFactoryService.getExecutor();
Executor executor =executorFactoryService.getServerExecutor();
if(executor!=null) {
ResourceResult result =executor.executeById(libEntity.getId(), map);
ExecuteResult result =executor.executeById(libEntity.getId(), map);
if(result!=null) {
List<ParameterResult> datas =result.getData();
if(datas!=null && datas.size()>0) {

32
io.sc.engine.rule.server/src/main/resources/META-INF/platform/plugins/parameters.json

@ -35,5 +35,37 @@
"last" : "parameter.re.server.modelDefine.nullVersion.strategy.last"
},
"order" : 100
},
///
{
"id" :"parameter.re.server.executorMode",
"parentId" :"parameter.re.server",
"code" :"parameter.re.server.executorMode",
"defaultValue" :"Local",
"order" : 200,
"options" :{
"Local" : "parameter.re.server.executorMode.Local",
"Remote" : "parameter.re.server.executorMode.Remote"
}
},
///
{
"id" :"parameter.re.server.loaderMode",
"parentId" :"parameter.re.server",
"code" :"parameter.re.server.loaderMode",
"defaultValue" :"Local",
"order" : 300,
"options" :{
"Local" : "parameter.re.server.loaderMode.Local",
"Remote" : "parameter.re.server.loaderMode.Remote"
}
},
/// API URL
{
"id" :"parameter.re.server.remoteApiUrl",
"parentId" :"parameter.re.server",
"code" :"parameter.re.server.remoteApiUrl",
"defaultValue" :"http://localhost:8080",
"order" : 400
}
]

5
io.sc.engine.rule.server/src/main/resources/liquibase/RE_1.0.0_20220515__Rule Engine Database Schema DDL.xml

@ -26,6 +26,7 @@
<column name="STATUS_" type="NVARCHAR(10)" remarks="状态(HISTORY:历史, ON_LINE:上线, OFF_LINE:下线,SKETCH:草稿,APPROVING:审批中)"/>
<column name="EFFECTIVE_DATE_" type="DATETIME" remarks="生效日期"/>
<column name="IMPORTS_" type="CLOB" remarks="import依赖的java类"/>
<column name="CACHE_EXECUTE_UNIT_" type="CLOB" remarks="缓存执行部件"/>
<column name="PARENT_ID_" type="NVARCHAR(36)" remarks="父ID"/>
<!-- 审计字段 -->
@ -153,6 +154,7 @@
</column>
<column name="CODE_" type="NVARCHAR(255)" remarks="代码"/>
<column name="NAME_" type="NVARCHAR(255)" remarks="名称"/>
<column name="ALIAS_" type="NVARCHAR(255)" remarks="别名"/>
<column name="DESCRIPTION_" type="NVARCHAR(255)" remarks="描述"/>
<column name="TYPE_" type="NVARCHAR(20)" remarks="类型"/>
<column name="LIB_CODE_" type="NVARCHAR(255)" remarks="库代码"/>
@ -165,7 +167,8 @@
<column name="VALUE_TYPE_IS_LIST_" type="SMALLINT" remarks="值数据类型是否是列表"/>
<column name="DEFAULT_VALUE_" type="CLOB" remarks="默认值"/>
<column name="ORDER_" type="INTEGER" remarks="排序"/>
<column name="SHOW_IF_" type="NVARCHAR(1024)" remarks="显示条件"/>
<column name="IS_PERSISTENT_AS_INDICATOR" type="SMALLINT" remarks="是否作为指标存储"/>
<column name="PROPERTIES_" type="CLOB" remarks="属性"/>
<!-- 审计字段 -->
<column name="JPA_VERSION_" type="INTEGER" remarks="JPA乐观锁版本"/>

1
io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/words.properties

@ -4,6 +4,7 @@ add=Add
addChild=Add Child {object}
addNew=Add
addTop=Add Top {object}
alias=Alias
alter=Alter
autoCreate=Auto Create
bottom-left=Bottom Left

1
io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/words_tw_CN.properties

@ -4,6 +4,7 @@ add=\u6DFB\u52A0
addChild=\u65B0\u589E\u5B50{object}
addNew=\u65B0\u589E
addTop=\u65B0\u589E\u9802\u7D1A{object}
alias=\u5225\u540D
alter=\u901A\u77E5
autoCreate=\u81EA\u52D5\u5275\u5EFA
bottom-left=\u5DE6\u4E0B

1
io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/words_zh_CN.properties

@ -4,6 +4,7 @@ add=\u6DFB\u52A0
addChild=\u65B0\u589E\u5B50{object}
addNew=\u65B0\u589E
addTop=\u65B0\u589E\u9876\u7EA7{object}
alias=\u5225\u540D
alter=\u901A\u77E5
autoCreate=\u81EA\u52A8\u521B\u5EFA
bottom-left=\u5DE6\u4E0B

Loading…
Cancel
Save