From c6339d8e831683584d0286474b8eb87999fb2677 Mon Sep 17 00:00:00 2001 From: icanci Date: Sat, 19 Nov 2022 09:36:34 +0800 Subject: [PATCH] rule develop --- rec-admin/rec-admin-biz/pom.xml | 2 +- .../rec/admin/biz/config/RecAdminConfig.java | 20 +- .../admin/biz/model/StrategyDebugResult.java | 11 + .../admin/biz/service/DataSourceService.java | 3 +- .../admin/biz/service/StrategyService.java | 5 + .../rec/admin/biz/service/WebApiService.java | 8 + .../service/impl/DataSourceServiceImpl.java | 31 ++- .../biz/service/impl/StrategyServiceImpl.java | 28 +- .../biz/service/impl/WebApiServiceImpl.java | 13 + .../rec/admin/biz/spi/AbstractLoadSPI.java | 14 + .../rec/admin/biz/spi/AdminBaseDataSPI.java | 24 ++ .../rec/admin/biz/spi/AdminDataSourceSPI.java | 23 ++ .../rec/admin/biz/spi/AdminDomainSPI.java | 30 +++ .../rec/admin/biz/spi/AdminMetadataSPI.java | 23 ++ .../rec/admin/biz/spi/AdminSceneSPI.java | 28 ++ .../rec/admin/biz/spi/AdminStrategySPI.java | 24 ++ .../cn.icanci.rec.engine.sdk.spi.BaseDataSPI | 1 + ...cn.icanci.rec.engine.sdk.spi.DataSourceSPI | 1 + .../cn.icanci.rec.engine.sdk.spi.DomainSPI | 1 + .../cn.icanci.rec.engine.sdk.spi.MetadataSPI | 1 + .../rec/cn.icanci.rec.engine.sdk.spi.SceneSPI | 1 + .../cn.icanci.rec.engine.sdk.spi.StrategySPI | 1 + .../mongodb/daointerface/DataSourceDAO.java | 6 +- .../dal/mongodb/daointerface/StrategyDAO.java | 2 + .../dal/mongodb/mongo/MongoDataSourceDAO.java | 11 +- .../dal/mongodb/mongo/MongoSceneDAO.java | 1 - .../dal/mongodb/mongo/MongoStrategyDAO.java | 21 ++ .../vueboot/src/api/dataSourceApi.js | 6 +- .../resources/vueboot/src/api/strategyApi.js | 65 +++++ .../resources/vueboot/src/router/index.js | 16 ++ .../vueboot/src/views/common/vue-log.vue | 2 +- .../src/views/ruleConfig/dataSource.vue | 83 +++++- .../views/ruleConfig/dialog/baseDataForm.vue | 10 + .../ruleConfig/dialog/dataSourceForm.vue | 225 +++++++++++++--- .../views/ruleConfig/dialog/domainForm.vue | 7 +- .../views/ruleConfig/dialog/metadataForm.vue | 4 +- .../views/ruleConfig/dialog/strategyForm.vue | 141 ++++++++++ .../vueboot/src/views/ruleConfig/strategy.vue | 242 ++++++++++++++++++ .../config/DataSourceController.java | 6 +- .../controller/config/StrategyController.java | 54 ++++ .../rec/admin/web/form/StrategyDebugForm.java | 33 +++ .../rec/admin/web/form/StrategyQueryForm.java | 20 ++ .../admin/web/mapper/LogOperateWebMapper.java | 3 +- .../rec/common/enums/ModuleTypeEnum.java | 4 + .../icanci/rec/common/utils/FieldUtils.java | 28 ++ .../rec/common/utils}/PropertiesUtil.java | 2 +- .../script/client/http/OkHttpClientImpl.java | 4 +- .../engine/sdk/http/spi/AbstractLoadSPI.java | 4 +- .../rec/engine/sdk/netty/PropertiesUtil.java | 56 ---- .../engine/sdk/netty/spi/AbstractLoadSPI.java | 23 ++ .../sdk/netty/spi/NettyBaseDataSPI.java | 24 ++ .../sdk/netty/spi/NettyDataSourceSPI.java | 23 ++ .../engine/sdk/netty/spi/NettyDomainSPI.java | 29 +++ .../sdk/netty/spi/NettyMetadataSPI.java | 23 ++ .../engine/sdk/netty/spi/NettySceneSPI.java | 28 ++ .../sdk/netty/spi/NettyStrategySPI.java | 24 ++ .../engine/sdk/RecEngineSDKAutoConfig.java | 77 +++++- .../sdk/exception/InjectionBeanException.java | 29 +++ .../rec/engine/sdk/extensions/RecSpi.java | 2 + .../rec/engine/sdk/extensions/SpringBean.java | 21 ++ .../rec/engine/sdk/rule/EngineExecutor.java | 2 +- 61 files changed, 1512 insertions(+), 142 deletions(-) create mode 100644 rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/model/StrategyDebugResult.java create mode 100644 rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/service/WebApiService.java create mode 100644 rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/service/impl/WebApiServiceImpl.java create mode 100644 rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/spi/AbstractLoadSPI.java create mode 100644 rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/spi/AdminBaseDataSPI.java create mode 100644 rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/spi/AdminDataSourceSPI.java create mode 100644 rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/spi/AdminDomainSPI.java create mode 100644 rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/spi/AdminMetadataSPI.java create mode 100644 rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/spi/AdminSceneSPI.java create mode 100644 rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/spi/AdminStrategySPI.java create mode 100644 rec-admin/rec-admin-biz/src/main/resources/META-INF/rec/cn.icanci.rec.engine.sdk.spi.BaseDataSPI create mode 100644 rec-admin/rec-admin-biz/src/main/resources/META-INF/rec/cn.icanci.rec.engine.sdk.spi.DataSourceSPI create mode 100644 rec-admin/rec-admin-biz/src/main/resources/META-INF/rec/cn.icanci.rec.engine.sdk.spi.DomainSPI create mode 100644 rec-admin/rec-admin-biz/src/main/resources/META-INF/rec/cn.icanci.rec.engine.sdk.spi.MetadataSPI create mode 100644 rec-admin/rec-admin-biz/src/main/resources/META-INF/rec/cn.icanci.rec.engine.sdk.spi.SceneSPI create mode 100644 rec-admin/rec-admin-biz/src/main/resources/META-INF/rec/cn.icanci.rec.engine.sdk.spi.StrategySPI create mode 100644 rec-admin/rec-admin-views/src/main/resources/vueboot/src/api/strategyApi.js create mode 100644 rec-admin/rec-admin-views/src/main/resources/vueboot/src/views/ruleConfig/dialog/strategyForm.vue create mode 100644 rec-admin/rec-admin-views/src/main/resources/vueboot/src/views/ruleConfig/strategy.vue create mode 100644 rec-admin/rec-admin-web/src/main/java/cn/icanci/rec/admin/web/controller/config/StrategyController.java create mode 100644 rec-admin/rec-admin-web/src/main/java/cn/icanci/rec/admin/web/form/StrategyDebugForm.java create mode 100644 rec-admin/rec-admin-web/src/main/java/cn/icanci/rec/admin/web/form/StrategyQueryForm.java create mode 100644 rec-common/src/main/java/cn/icanci/rec/common/utils/FieldUtils.java rename {rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http => rec-common/src/main/java/cn/icanci/rec/common/utils}/PropertiesUtil.java (97%) delete mode 100644 rec-engine/rec-engine-sdk-netty/src/main/java/cn/icanci/rec/engine/sdk/netty/PropertiesUtil.java create mode 100644 rec-engine/rec-engine-sdk-netty/src/main/java/cn/icanci/rec/engine/sdk/netty/spi/AbstractLoadSPI.java create mode 100644 rec-engine/rec-engine-sdk-netty/src/main/java/cn/icanci/rec/engine/sdk/netty/spi/NettyBaseDataSPI.java create mode 100644 rec-engine/rec-engine-sdk-netty/src/main/java/cn/icanci/rec/engine/sdk/netty/spi/NettyDataSourceSPI.java create mode 100644 rec-engine/rec-engine-sdk-netty/src/main/java/cn/icanci/rec/engine/sdk/netty/spi/NettyDomainSPI.java create mode 100644 rec-engine/rec-engine-sdk-netty/src/main/java/cn/icanci/rec/engine/sdk/netty/spi/NettyMetadataSPI.java create mode 100644 rec-engine/rec-engine-sdk-netty/src/main/java/cn/icanci/rec/engine/sdk/netty/spi/NettySceneSPI.java create mode 100644 rec-engine/rec-engine-sdk-netty/src/main/java/cn/icanci/rec/engine/sdk/netty/spi/NettyStrategySPI.java create mode 100644 rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/exception/InjectionBeanException.java create mode 100644 rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/extensions/SpringBean.java diff --git a/rec-admin/rec-admin-biz/pom.xml b/rec-admin/rec-admin-biz/pom.xml index b9c2d37..b9750f7 100644 --- a/rec-admin/rec-admin-biz/pom.xml +++ b/rec-admin/rec-admin-biz/pom.xml @@ -29,7 +29,7 @@ cn.icanci.rec - rec-engine-script + rec-engine-sdk ${parent.version} diff --git a/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/config/RecAdminConfig.java b/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/config/RecAdminConfig.java index b830f7d..cf6d64d 100644 --- a/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/config/RecAdminConfig.java +++ b/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/config/RecAdminConfig.java @@ -1,7 +1,5 @@ package cn.icanci.rec.admin.biz.config; -import cn.icanci.rec.engine.script.RecScriptEngine; -import cn.icanci.rec.engine.script.RecScriptEngineManager; import cn.icanci.rec.spi.event.DefaultEventDispatcher; import cn.icanci.rec.spi.event.EventDispatcher; @@ -32,15 +30,15 @@ public class RecAdminConfig implements ApplicationContextAware { return new DefaultEventDispatcher(); } - /** - * 执行引擎 - * - * @return 返回脚本执行引擎 - */ - @Bean("recScriptEngine") - public RecScriptEngine recScriptEngine() { - return RecScriptEngineManager.getRecScriptEngine(); - } + // /** + // * 执行引擎 + // * + // * @return 返回脚本执行引擎 + // */ + // @Bean("recScriptEngine") + // public RecScriptEngine recScriptEngine() { + // return RecScriptEngineManager.getRecScriptEngine(); + // } @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { diff --git a/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/model/StrategyDebugResult.java b/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/model/StrategyDebugResult.java new file mode 100644 index 0000000..aded7bc --- /dev/null +++ b/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/model/StrategyDebugResult.java @@ -0,0 +1,11 @@ +package cn.icanci.rec.admin.biz.model; + +import java.io.Serializable; + +/** + * @author icanci + * @since 1.0 Created in 2022/11/18 22:35 + */ +public class StrategyDebugResult implements Serializable { + private static final long serialVersionUID = -5412720512170304475L; +} diff --git a/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/service/DataSourceService.java b/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/service/DataSourceService.java index 87a6f53..0c9cbcd 100644 --- a/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/service/DataSourceService.java +++ b/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/service/DataSourceService.java @@ -27,10 +27,11 @@ public interface DataSourceService extends BaseService { /** * 根据 dataSourceName 查询数据源 * + * @param domainCode domainCode * @param dataSourceName dataSourceName * @return 返回 根据 dataSourceName 查询数据源 */ - DataSourceVO queryByDataSourceName(String dataSourceName); + DataSourceVO queryByDataSourceName(String domainCode, String dataSourceName); /** * 下拉框加载 diff --git a/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/service/StrategyService.java b/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/service/StrategyService.java index 6f7f24a..d98e1b9 100644 --- a/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/service/StrategyService.java +++ b/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/service/StrategyService.java @@ -1,5 +1,6 @@ package cn.icanci.rec.admin.biz.service; +import cn.icanci.rec.admin.biz.model.StrategyDebugResult; import cn.icanci.rec.admin.dal.mongodb.common.PageList; import cn.icanci.rec.common.model.config.StrategyVO; @@ -21,4 +22,8 @@ public interface StrategyService extends BaseService { @Override PageList queryPage(StrategyVO strategyVO, int pageNum, int pageSize); + + StrategyVO queryByStrategyName(String domainCode, String strategyName); + + StrategyDebugResult debug(StrategyVO strategy, String scriptContentTest); } diff --git a/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/service/WebApiService.java b/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/service/WebApiService.java new file mode 100644 index 0000000..06382d8 --- /dev/null +++ b/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/service/WebApiService.java @@ -0,0 +1,8 @@ +package cn.icanci.rec.admin.biz.service; + +/** + * @author icanci + * @since 1.0 Created in 2022/11/18 22:49 + */ +public interface WebApiService { +} diff --git a/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/service/impl/DataSourceServiceImpl.java b/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/service/impl/DataSourceServiceImpl.java index f2abaf5..0584b7b 100644 --- a/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/service/impl/DataSourceServiceImpl.java +++ b/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/service/impl/DataSourceServiceImpl.java @@ -19,6 +19,7 @@ import cn.icanci.rec.engine.script.wrapper.HttpResponseWrapper; import cn.icanci.rec.spi.event.EventDispatcher; import java.util.List; +import java.util.Map; import java.util.concurrent.*; import javax.annotation.Resource; @@ -26,6 +27,7 @@ import javax.annotation.Resource; import org.apache.commons.collections4.CollectionUtils; import org.springframework.stereotype.Service; +import com.alibaba.fastjson.JSONException; import com.google.common.collect.Lists; /** @@ -72,8 +74,8 @@ public class DataSourceServiceImpl implements DataSourceService { } @Override - public DataSourceVO queryByDataSourceName(String dataSourceName) { - return dataSourceMapper.do2vo(dataSourceDAO.queryByDataSourceName(dataSourceName)); + public DataSourceVO queryByDataSourceName(String domainCode, String dataSourceName) { + return dataSourceMapper.do2vo(dataSourceDAO.queryByDataSourceName(domainCode, dataSourceName)); } @Override @@ -109,9 +111,22 @@ public class DataSourceServiceImpl implements DataSourceService { result.setScriptType(scriptInfo.getScriptType().getDesc()); // 脚本执行 RecScriptEngineContext context = scriptExecutor(scriptInfo); + Object realRetVal = context.getRealRetVal(); if (context.isSuccess()) { - result.setSuccess(true); - result.setRealResult(context.getRealRetVal()); + if (realRetVal instanceof Integer || realRetVal instanceof Double || realRetVal instanceof Long) { + result.setSuccess(false); + result.setExceptionMessage("脚本执行返回类型为:" + realRetVal.getClass().getName()); + } else if (realRetVal instanceof String) { + FastJsonUtils.fromJSONString(String.valueOf(realRetVal), Map.class); + result.setSuccess(true); + result.setRealResult(context.getRealRetVal()); + } else if (realRetVal instanceof Map) { + result.setSuccess(true); + result.setRealResult(FastJsonUtils.toJSONString(context.getRealRetVal())); + } else { + result.setSuccess(false); + result.setExceptionMessage("脚本执行返回类型为:" + realRetVal.getClass().getName()); + } } else { result.setSuccess(false); result.setExceptionMessage(context.getThrowable().getMessage()); @@ -135,7 +150,11 @@ public class DataSourceServiceImpl implements DataSourceService { return result; } catch (Throwable e) { result.setSuccess(false); - result.setExceptionMessage(e.getMessage()); + if (e instanceof JSONException) { + result.setExceptionMessage("Json解析异常,脚本执行返回结果不为Map格式:" + e.getMessage()); + } else { + result.setExceptionMessage(e.getMessage()); + } return result; } } @@ -151,7 +170,7 @@ public class DataSourceServiceImpl implements DataSourceService { */ private RecScriptEngineContext scriptExecutor(DataSourceVO.ScriptInfo scriptInfo) throws InterruptedException, ExecutionException, TimeoutException { FutureTask> task = new FutureTask<>(new ScriptExecutor(scriptInfo, recScriptEngine)); - // TODO 启动计算:测试使用单独线程、运行时应创建线程池 + // 启动计算:测试使用单独线程、运行时应创建线程池 new Thread(task).start(); // 等待执行结果 return task.get(scriptInfo.getTimeout(), TimeUnit.SECONDS); diff --git a/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/service/impl/StrategyServiceImpl.java b/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/service/impl/StrategyServiceImpl.java index f9c8fe1..3362f8e 100644 --- a/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/service/impl/StrategyServiceImpl.java +++ b/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/service/impl/StrategyServiceImpl.java @@ -1,11 +1,17 @@ package cn.icanci.rec.admin.biz.service.impl; +import cn.icanci.rec.admin.biz.event.log.LogEvent; import cn.icanci.rec.admin.biz.mapper.StrategyMapper; +import cn.icanci.rec.admin.biz.model.StrategyDebugResult; import cn.icanci.rec.admin.biz.service.StrategyService; import cn.icanci.rec.admin.dal.mongodb.common.PageList; import cn.icanci.rec.admin.dal.mongodb.daointerface.StrategyDAO; import cn.icanci.rec.admin.dal.mongodb.dateobject.StrategyDO; +import cn.icanci.rec.common.enums.LogOperatorTypeEnum; +import cn.icanci.rec.common.enums.ModuleTypeEnum; import cn.icanci.rec.common.model.config.StrategyVO; +import cn.icanci.rec.common.utils.FastJsonUtils; +import cn.icanci.rec.spi.event.EventDispatcher; import java.util.List; @@ -20,9 +26,11 @@ import org.springframework.stereotype.Service; @Service public class StrategyServiceImpl implements StrategyService { @Resource - private StrategyDAO strategyDAO; + private StrategyDAO strategyDAO; @Resource - private StrategyMapper strategyMapper; + private StrategyMapper strategyMapper; + @Resource + private EventDispatcher eventDispatcher; @Override public List queryAll() { @@ -32,9 +40,12 @@ public class StrategyServiceImpl implements StrategyService { @Override public void save(StrategyVO strategy) { if (doInsert(strategy)) { - strategyDAO.insert(strategyMapper.vo2do(strategy)); + StrategyDO insert = strategyMapper.vo2do(strategy); + strategyDAO.insert(insert); + eventDispatcher.fire(new LogEvent(insert.getUuid(), ModuleTypeEnum.REC_STRATEGY, FastJsonUtils.toJSONString(insert), LogOperatorTypeEnum.CREATE)); } else { strategyDAO.update(strategyMapper.vo2do(strategy)); + eventDispatcher.fire(new LogEvent(strategy.getUuid(), ModuleTypeEnum.REC_STRATEGY, FastJsonUtils.toJSONString(strategy), LogOperatorTypeEnum.UPDATE)); } } @@ -48,4 +59,15 @@ public class StrategyServiceImpl implements StrategyService { PageList pageQuery = strategyDAO.pageQuery(strategyMapper.vo2do(strategy), pageNum, pageSize); return new PageList<>(strategyMapper.dos2vos(pageQuery.getData()), pageQuery.getPaginator()); } + + @Override + public StrategyVO queryByStrategyName(String domainCode, String strategyName) { + return strategyMapper.do2vo(strategyDAO.queryByStrategyName(domainCode, strategyName)); + } + + @Override + public StrategyDebugResult debug(StrategyVO strategy, String scriptContentTest) { + + return null; + } } diff --git a/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/service/impl/WebApiServiceImpl.java b/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/service/impl/WebApiServiceImpl.java new file mode 100644 index 0000000..9242a63 --- /dev/null +++ b/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/service/impl/WebApiServiceImpl.java @@ -0,0 +1,13 @@ +package cn.icanci.rec.admin.biz.service.impl; + +import cn.icanci.rec.admin.biz.service.WebApiService; + +import org.springframework.stereotype.Service; + +/** + * @author icanci + * @since 1.0 Created in 2022/11/18 22:49 + */ +@Service +public class WebApiServiceImpl implements WebApiService { +} diff --git a/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/spi/AbstractLoadSPI.java b/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/spi/AbstractLoadSPI.java new file mode 100644 index 0000000..e7c5d2d --- /dev/null +++ b/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/spi/AbstractLoadSPI.java @@ -0,0 +1,14 @@ +package cn.icanci.rec.admin.biz.spi; + +import cn.icanci.rec.admin.biz.service.WebApiService; +import cn.icanci.rec.engine.sdk.extensions.SpringBean; + +/** + * @author icanci + * @since 1.0 Created in 2022/11/18 22:39 + */ +@SpringBean({ WebApiService.class }) +public abstract class AbstractLoadSPI { + protected static WebApiService staticWebApiService; + protected WebApiService webApiService; +} diff --git a/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/spi/AdminBaseDataSPI.java b/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/spi/AdminBaseDataSPI.java new file mode 100644 index 0000000..7fb91f1 --- /dev/null +++ b/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/spi/AdminBaseDataSPI.java @@ -0,0 +1,24 @@ +package cn.icanci.rec.admin.biz.spi; + +import cn.icanci.rec.common.aggregation.model.BaseDataDTO; +import cn.icanci.rec.engine.sdk.spi.BaseDataSPI; + +import java.util.List; +import java.util.Set; + +/** + * @author icanci + * @since 1.0 Created in 2022/11/18 19:37 + */ +public class AdminBaseDataSPI extends AbstractLoadSPI implements BaseDataSPI { + + @Override + public List load(Set domains) { + return null; + } + + @Override + public List load(String domain) { + return null; + } +} diff --git a/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/spi/AdminDataSourceSPI.java b/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/spi/AdminDataSourceSPI.java new file mode 100644 index 0000000..432c332 --- /dev/null +++ b/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/spi/AdminDataSourceSPI.java @@ -0,0 +1,23 @@ +package cn.icanci.rec.admin.biz.spi; + +import cn.icanci.rec.common.aggregation.model.DataSourceDTO; +import cn.icanci.rec.engine.sdk.spi.DataSourceSPI; + +import java.util.List; +import java.util.Set; + +/** + * @author icanci + * @since 1.0 Created in 2022/11/18 19:37 + */ +public class AdminDataSourceSPI extends AbstractLoadSPI implements DataSourceSPI { + @Override + public List load(Set domains) { + return null; + } + + @Override + public List load(String domain) { + return null; + } +} diff --git a/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/spi/AdminDomainSPI.java b/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/spi/AdminDomainSPI.java new file mode 100644 index 0000000..a8bd9ca --- /dev/null +++ b/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/spi/AdminDomainSPI.java @@ -0,0 +1,30 @@ +package cn.icanci.rec.admin.biz.spi; + +import cn.icanci.rec.common.aggregation.model.DomainDTO; +import cn.icanci.rec.engine.sdk.extensions.SpringBean; +import cn.icanci.rec.engine.sdk.spi.DomainSPI; + +import java.util.List; +import java.util.Set; + +/** + * @author icanci + * @since 1.0 Created in 2022/11/18 19:37 + */ +public class AdminDomainSPI extends AbstractLoadSPI implements DomainSPI { + + @Override + public DomainDTO loadOne(String domain) { + return null; + } + + @Override + public List load(Set domains) { + return null; + } + + @Override + public List load(String domain) { + return null; + } +} diff --git a/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/spi/AdminMetadataSPI.java b/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/spi/AdminMetadataSPI.java new file mode 100644 index 0000000..fac2a1b --- /dev/null +++ b/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/spi/AdminMetadataSPI.java @@ -0,0 +1,23 @@ +package cn.icanci.rec.admin.biz.spi; + +import cn.icanci.rec.common.aggregation.model.MetadataDTO; +import cn.icanci.rec.engine.sdk.spi.MetadataSPI; + +import java.util.List; +import java.util.Set; + +/** + * @author icanci + * @since 1.0 Created in 2022/11/18 19:37 + */ +public class AdminMetadataSPI extends AbstractLoadSPI implements MetadataSPI { + @Override + public List load(Set domains) { + return null; + } + + @Override + public List load(String domain) { + return null; + } +} diff --git a/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/spi/AdminSceneSPI.java b/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/spi/AdminSceneSPI.java new file mode 100644 index 0000000..a15a607 --- /dev/null +++ b/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/spi/AdminSceneSPI.java @@ -0,0 +1,28 @@ +package cn.icanci.rec.admin.biz.spi; + +import cn.icanci.rec.common.aggregation.model.SceneDTO; +import cn.icanci.rec.engine.sdk.spi.SceneSPI; + +import java.util.List; +import java.util.Set; + +/** + * @author icanci + * @since 1.0 Created in 2022/11/18 19:37 + */ +public class AdminSceneSPI extends AbstractLoadSPI implements SceneSPI { + @Override + public List load(Set domains) { + return null; + } + + @Override + public List load(String domain) { + return null; + } + + @Override + public SceneDTO loadOne(String domainCode) { + return null; + } +} diff --git a/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/spi/AdminStrategySPI.java b/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/spi/AdminStrategySPI.java new file mode 100644 index 0000000..ed7fd9c --- /dev/null +++ b/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/spi/AdminStrategySPI.java @@ -0,0 +1,24 @@ +package cn.icanci.rec.admin.biz.spi; + +import cn.icanci.rec.common.aggregation.model.StrategyDTO; +import cn.icanci.rec.engine.sdk.spi.StrategySPI; + +import java.util.List; +import java.util.Set; + +/** + * @author icanci + * @since 1.0 Created in 2022/11/18 19:37 + */ +public class AdminStrategySPI extends AbstractLoadSPI implements StrategySPI { + @Override + public List load(Set domains) { + return null; + } + + @Override + public List load(String domain) { + return null; + } + +} diff --git a/rec-admin/rec-admin-biz/src/main/resources/META-INF/rec/cn.icanci.rec.engine.sdk.spi.BaseDataSPI b/rec-admin/rec-admin-biz/src/main/resources/META-INF/rec/cn.icanci.rec.engine.sdk.spi.BaseDataSPI new file mode 100644 index 0000000..b10b128 --- /dev/null +++ b/rec-admin/rec-admin-biz/src/main/resources/META-INF/rec/cn.icanci.rec.engine.sdk.spi.BaseDataSPI @@ -0,0 +1 @@ +cn.icanci.rec.admin.biz.spi.AdminBaseDataSPI \ No newline at end of file diff --git a/rec-admin/rec-admin-biz/src/main/resources/META-INF/rec/cn.icanci.rec.engine.sdk.spi.DataSourceSPI b/rec-admin/rec-admin-biz/src/main/resources/META-INF/rec/cn.icanci.rec.engine.sdk.spi.DataSourceSPI new file mode 100644 index 0000000..3d9f1e9 --- /dev/null +++ b/rec-admin/rec-admin-biz/src/main/resources/META-INF/rec/cn.icanci.rec.engine.sdk.spi.DataSourceSPI @@ -0,0 +1 @@ +cn.icanci.rec.admin.biz.spi.AdminDataSourceSPI \ No newline at end of file diff --git a/rec-admin/rec-admin-biz/src/main/resources/META-INF/rec/cn.icanci.rec.engine.sdk.spi.DomainSPI b/rec-admin/rec-admin-biz/src/main/resources/META-INF/rec/cn.icanci.rec.engine.sdk.spi.DomainSPI new file mode 100644 index 0000000..c973f2f --- /dev/null +++ b/rec-admin/rec-admin-biz/src/main/resources/META-INF/rec/cn.icanci.rec.engine.sdk.spi.DomainSPI @@ -0,0 +1 @@ +cn.icanci.rec.admin.biz.spi.AdminDomainSPI \ No newline at end of file diff --git a/rec-admin/rec-admin-biz/src/main/resources/META-INF/rec/cn.icanci.rec.engine.sdk.spi.MetadataSPI b/rec-admin/rec-admin-biz/src/main/resources/META-INF/rec/cn.icanci.rec.engine.sdk.spi.MetadataSPI new file mode 100644 index 0000000..78d88d7 --- /dev/null +++ b/rec-admin/rec-admin-biz/src/main/resources/META-INF/rec/cn.icanci.rec.engine.sdk.spi.MetadataSPI @@ -0,0 +1 @@ +cn.icanci.rec.admin.biz.spi.AdminMetadataSPI \ No newline at end of file diff --git a/rec-admin/rec-admin-biz/src/main/resources/META-INF/rec/cn.icanci.rec.engine.sdk.spi.SceneSPI b/rec-admin/rec-admin-biz/src/main/resources/META-INF/rec/cn.icanci.rec.engine.sdk.spi.SceneSPI new file mode 100644 index 0000000..cd1e1cd --- /dev/null +++ b/rec-admin/rec-admin-biz/src/main/resources/META-INF/rec/cn.icanci.rec.engine.sdk.spi.SceneSPI @@ -0,0 +1 @@ +cn.icanci.rec.admin.biz.spi.AdminSceneSPI \ No newline at end of file diff --git a/rec-admin/rec-admin-biz/src/main/resources/META-INF/rec/cn.icanci.rec.engine.sdk.spi.StrategySPI b/rec-admin/rec-admin-biz/src/main/resources/META-INF/rec/cn.icanci.rec.engine.sdk.spi.StrategySPI new file mode 100644 index 0000000..33927d6 --- /dev/null +++ b/rec-admin/rec-admin-biz/src/main/resources/META-INF/rec/cn.icanci.rec.engine.sdk.spi.StrategySPI @@ -0,0 +1 @@ +cn.icanci.rec.admin.biz.spi.AdminStrategySPI \ No newline at end of file diff --git a/rec-admin/rec-admin-dal/src/main/java/cn/icanci/rec/admin/dal/mongodb/daointerface/DataSourceDAO.java b/rec-admin/rec-admin-dal/src/main/java/cn/icanci/rec/admin/dal/mongodb/daointerface/DataSourceDAO.java index 74f20f9..b1bbd83 100644 --- a/rec-admin/rec-admin-dal/src/main/java/cn/icanci/rec/admin/dal/mongodb/daointerface/DataSourceDAO.java +++ b/rec-admin/rec-admin-dal/src/main/java/cn/icanci/rec/admin/dal/mongodb/daointerface/DataSourceDAO.java @@ -16,7 +16,7 @@ public interface DataSourceDAO extends BaseDAO { */ Class COLLECTION_CLASS = DataSourceDO.class; - DataSourceDO queryByDataSourceName(String dataSourceName); + DataSourceDO queryByDataSourceName(String domainCode, String dataSourceName); interface DataSourceColumn extends BaseColumn { /** @@ -27,5 +27,9 @@ public interface DataSourceDAO extends BaseDAO { * 数据源类型 */ String dataSourceType = "dataSourceType"; + /** + * 数据源类型 + */ + String domainCode = "domainCode"; } } diff --git a/rec-admin/rec-admin-dal/src/main/java/cn/icanci/rec/admin/dal/mongodb/daointerface/StrategyDAO.java b/rec-admin/rec-admin-dal/src/main/java/cn/icanci/rec/admin/dal/mongodb/daointerface/StrategyDAO.java index 7671a9e..d8e2653 100644 --- a/rec-admin/rec-admin-dal/src/main/java/cn/icanci/rec/admin/dal/mongodb/daointerface/StrategyDAO.java +++ b/rec-admin/rec-admin-dal/src/main/java/cn/icanci/rec/admin/dal/mongodb/daointerface/StrategyDAO.java @@ -18,6 +18,8 @@ public interface StrategyDAO extends BaseDAO { */ Class COLLECTION_CLASS = StrategyDO.class; + StrategyDO queryByStrategyName(String domainCode, String strategyName); + interface StrategyColumn extends BaseColumn { /** * 域Code diff --git a/rec-admin/rec-admin-dal/src/main/java/cn/icanci/rec/admin/dal/mongodb/mongo/MongoDataSourceDAO.java b/rec-admin/rec-admin-dal/src/main/java/cn/icanci/rec/admin/dal/mongodb/mongo/MongoDataSourceDAO.java index ba23b89..1b52e90 100644 --- a/rec-admin/rec-admin-dal/src/main/java/cn/icanci/rec/admin/dal/mongodb/mongo/MongoDataSourceDAO.java +++ b/rec-admin/rec-admin-dal/src/main/java/cn/icanci/rec/admin/dal/mongodb/mongo/MongoDataSourceDAO.java @@ -1,5 +1,9 @@ package cn.icanci.rec.admin.dal.mongodb.mongo; +import cn.icanci.rec.admin.dal.mongodb.common.PageList; +import cn.icanci.rec.admin.dal.mongodb.daointerface.DataSourceDAO; +import cn.icanci.rec.admin.dal.mongodb.dateobject.DataSourceDO; + import java.util.List; import org.apache.commons.lang3.StringUtils; @@ -8,10 +12,6 @@ import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.stereotype.Service; -import cn.icanci.rec.admin.dal.mongodb.common.PageList; -import cn.icanci.rec.admin.dal.mongodb.daointerface.DataSourceDAO; -import cn.icanci.rec.admin.dal.mongodb.dateobject.DataSourceDO; - /** * @author icanci * @since 1.0 Created in 2022/11/11 15:52 @@ -65,9 +65,10 @@ public class MongoDataSourceDAO extends AbstractBaseDAO implements } @Override - public DataSourceDO queryByDataSourceName(String dataSourceName) { + public DataSourceDO queryByDataSourceName(String domainCode, String dataSourceName) { Criteria criteria = Criteria.where(DataSourceColumn.dataSourceName).is(dataSourceName); criteria.and(DataSourceColumn.env).is(DEFAULT_ENV); + criteria.and(DataSourceColumn.domainCode).is(domainCode); Query query = new Query(criteria); return mongoTemplate.findOne(query, COLLECTION_CLASS, COLLECTION_NAME); } diff --git a/rec-admin/rec-admin-dal/src/main/java/cn/icanci/rec/admin/dal/mongodb/mongo/MongoSceneDAO.java b/rec-admin/rec-admin-dal/src/main/java/cn/icanci/rec/admin/dal/mongodb/mongo/MongoSceneDAO.java index 5a40678..1b521c6 100644 --- a/rec-admin/rec-admin-dal/src/main/java/cn/icanci/rec/admin/dal/mongodb/mongo/MongoSceneDAO.java +++ b/rec-admin/rec-admin-dal/src/main/java/cn/icanci/rec/admin/dal/mongodb/mongo/MongoSceneDAO.java @@ -42,7 +42,6 @@ public class MongoSceneDAO extends AbstractBaseDAO implements SceneDAO public PageList pageQuery(SceneDO sceneDO, int pageNum, int pageSize) { Criteria criteria = Criteria.where(SceneColumn.env).is(DEFAULT_ENV); if (StringUtils.isNotBlank(sceneDO.getDomainCode())) { - // 不分区大小写查询,其中操作符"i":表示不分区大小写 criteria.and(SceneColumn.domainCode).is(sceneDO.getDomainCode()); } diff --git a/rec-admin/rec-admin-dal/src/main/java/cn/icanci/rec/admin/dal/mongodb/mongo/MongoStrategyDAO.java b/rec-admin/rec-admin-dal/src/main/java/cn/icanci/rec/admin/dal/mongodb/mongo/MongoStrategyDAO.java index 7c582f1..5b023f9 100644 --- a/rec-admin/rec-admin-dal/src/main/java/cn/icanci/rec/admin/dal/mongodb/mongo/MongoStrategyDAO.java +++ b/rec-admin/rec-admin-dal/src/main/java/cn/icanci/rec/admin/dal/mongodb/mongo/MongoStrategyDAO.java @@ -6,6 +6,7 @@ import cn.icanci.rec.admin.dal.mongodb.dateobject.StrategyDO; import java.util.List; +import org.apache.commons.lang3.StringUtils; import org.springframework.data.domain.Sort; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; @@ -40,6 +41,17 @@ public class MongoStrategyDAO extends AbstractBaseDAO implements Str @Override public PageList pageQuery(StrategyDO strategyDO, int pageNum, int pageSize) { Criteria criteria = Criteria.where(StrategyColumn.env).is(DEFAULT_ENV); + if (StringUtils.isNotBlank(strategyDO.getDomainCode())) { + criteria.and(StrategyColumn.domainCode).is(strategyDO.getDomainCode()); + } + if (StringUtils.isNotBlank(strategyDO.getStrategyName())) { + // 不分区大小写查询,其中操作符"i":表示不分区大小写 + criteria.and(StrategyColumn.strategyName).regex("^.*" + strategyDO.getStrategyName() + ".*$", "i"); + } + if (StringUtils.isNotBlank(strategyDO.getSceneCode())) { + criteria.and(StrategyColumn.sceneCode).is(strategyDO.getSceneCode()); + } + Query query = new Query(criteria); query.with(Sort.by(Sort.Direction.DESC, StrategyColumn.createTime)); return pageQuery(query, COLLECTION_CLASS, pageSize, pageNum, COLLECTION_NAME); @@ -53,4 +65,13 @@ public class MongoStrategyDAO extends AbstractBaseDAO implements Str Query query = new Query(criteria); return mongoTemplate.findOne(query, COLLECTION_CLASS, COLLECTION_NAME); } + + @Override + public StrategyDO queryByStrategyName(String domainCode, String strategyName) { + Criteria criteria = Criteria.where(StrategyColumn.domainCode).is(domainCode); + criteria.and(StrategyColumn.env).is(DEFAULT_ENV); + criteria.and(StrategyColumn.strategyName).is(strategyName); + Query query = new Query(criteria); + return mongoTemplate.findOne(query, COLLECTION_CLASS, COLLECTION_NAME); + } } \ No newline at end of file diff --git a/rec-admin/rec-admin-views/src/main/resources/vueboot/src/api/dataSourceApi.js b/rec-admin/rec-admin-views/src/main/resources/vueboot/src/api/dataSourceApi.js index e3f5474..c021566 100644 --- a/rec-admin/rec-admin-views/src/main/resources/vueboot/src/api/dataSourceApi.js +++ b/rec-admin/rec-admin-views/src/main/resources/vueboot/src/api/dataSourceApi.js @@ -6,9 +6,9 @@ import request from '@/utils/request' * @param dataSourceName dataSourceName * @returns {*} */ -export async function remoteValidateDataSourceName(dataSourceName) { +export async function remoteValidateDataSourceName(domainCode, dataSourceName) { return await request({ - url: '/rec/dataSource/validateDataSourceName/' + dataSourceName, + url: '/rec/dataSource/validateDataSourceName/' + domainCode + "/" + dataSourceName, method: 'get', }) } @@ -30,7 +30,7 @@ export async function saveDataSource(dataSource) { /** * 分页查询 * - * @param baseData baseData + * @param dataSource dataSource * @param paginator paginator * @returns {*} */ diff --git a/rec-admin/rec-admin-views/src/main/resources/vueboot/src/api/strategyApi.js b/rec-admin/rec-admin-views/src/main/resources/vueboot/src/api/strategyApi.js new file mode 100644 index 0000000..88f6842 --- /dev/null +++ b/rec-admin/rec-admin-views/src/main/resources/vueboot/src/api/strategyApi.js @@ -0,0 +1,65 @@ +import request from '@/utils/request' + +/** + * 验证 strategyName + * + * @param domainCode domainCode + * @param dataSourceName dataSourceName + * @returns {*} + */ +export async function remoteValidateStrategyName(domainCode, dataSourceName) { + return await request({ + url: '/rec/strategy/validateStrategyName/' + domainCode + "/" + dataSourceName, + method: 'get', + }) +} + +/** + * 保存 + * + * @param strategy strategy + * @returns {*} + */ +export async function saveStrategy(strategy) { + return await request({ + url: '/rec/strategy/save', + method: 'post', + data: strategy + }) +} + +/** + * 分页查询 + * + * @param strategy strategy + * @param paginator paginator + * @returns {*} + */ +export async function strategyPageQuery(strategy, paginator) { + return await request({ + url: '/rec/strategy/query', + method: 'post', + data: { + 'strategy': strategy, + 'paginator': paginator + } + }) +} + +/** + * 测试 + * + * @param strategy strategy + * @param scriptContentTest scriptContentTest + * @returns {*} + */ +export async function strategyDebug(strategy, scriptContentTest) { + return await request({ + url: '/rec/strategy/debug', + method: 'post', + data: { + 'strategy': strategy, + 'scriptContentTest': scriptContentTest + } + }) +} diff --git a/rec-admin/rec-admin-views/src/main/resources/vueboot/src/router/index.js b/rec-admin/rec-admin-views/src/main/resources/vueboot/src/router/index.js index f7cdd5a..2ced30b 100644 --- a/rec-admin/rec-admin-views/src/main/resources/vueboot/src/router/index.js +++ b/rec-admin/rec-admin-views/src/main/resources/vueboot/src/router/index.js @@ -78,6 +78,22 @@ export const constantRouterMap = [ title: '基础数据配置', icon: 'clipboard' } + }, { + path: 'dataSource', + name: 'dataSource', + component: () => import('@/views/ruleConfig/dataSource'), + meta: { + title: '数据源配置', + icon: 'clipboard' + } + },{ + path: 'strategy', + name: 'strategy', + component: () => import('@/views/ruleConfig/strategy'), + meta: { + title: '策略配置', + icon: 'clipboard' + } }, ] }, diff --git a/rec-admin/rec-admin-views/src/main/resources/vueboot/src/views/common/vue-log.vue b/rec-admin/rec-admin-views/src/main/resources/vueboot/src/views/common/vue-log.vue index c247a9d..5a04c6b 100644 --- a/rec-admin/rec-admin-views/src/main/resources/vueboot/src/views/common/vue-log.vue +++ b/rec-admin/rec-admin-views/src/main/resources/vueboot/src/views/common/vue-log.vue @@ -48,7 +48,7 @@ {{ dateFormat(scope.row.createTime) }} - + diff --git a/rec-admin/rec-admin-views/src/main/resources/vueboot/src/views/ruleConfig/dataSource.vue b/rec-admin/rec-admin-views/src/main/resources/vueboot/src/views/ruleConfig/dataSource.vue index 2560097..de95f7d 100644 --- a/rec-admin/rec-admin-views/src/main/resources/vueboot/src/views/ruleConfig/dataSource.vue +++ b/rec-admin/rec-admin-views/src/main/resources/vueboot/src/views/ruleConfig/dataSource.vue @@ -3,6 +3,20 @@ + + + + + + @@ -20,11 +34,41 @@ border :default-sort="{prop: 'updateTime', order: 'descending'}" style="width: 100%; margin-top: 20px;font-size: 10px"> + + + + + + + + + + + - - + + + + + - - + + - + + + + + + + + + + +
+ 是否执行成功:{{ debugResult.success }}
+ 脚本类型:{{ debugResult.scriptType }}
+ 实际执行结果:{{ debugResult.realResult }}
+ 执行异常:{{ debugResult.exceptionMessage }} +
+
取 消 - 确 定 + 脚本测试 + HTTP测试 + 确 定 diff --git a/rec-admin/rec-admin-views/src/main/resources/vueboot/src/views/ruleConfig/strategy.vue b/rec-admin/rec-admin-views/src/main/resources/vueboot/src/views/ruleConfig/strategy.vue new file mode 100644 index 0000000..87b196d --- /dev/null +++ b/rec-admin/rec-admin-views/src/main/resources/vueboot/src/views/ruleConfig/strategy.vue @@ -0,0 +1,242 @@ + + diff --git a/rec-admin/rec-admin-web/src/main/java/cn/icanci/rec/admin/web/controller/config/DataSourceController.java b/rec-admin/rec-admin-web/src/main/java/cn/icanci/rec/admin/web/controller/config/DataSourceController.java index ebd7191..7479350 100644 --- a/rec-admin/rec-admin-web/src/main/java/cn/icanci/rec/admin/web/controller/config/DataSourceController.java +++ b/rec-admin/rec-admin-web/src/main/java/cn/icanci/rec/admin/web/controller/config/DataSourceController.java @@ -40,9 +40,9 @@ public class DataSourceController { return R.builderOk().build(); } - @GetMapping("validateDataSourceName/{dataSourceName}") - public R validateDataSourceName(@PathVariable("dataSourceName") String dataSourceName) { - DataSourceVO dataSource = dataSourceService.queryByDataSourceName(dataSourceName); + @GetMapping("validateDataSourceName/{domainCode}/{dataSourceName}") + public R validateDataSourceName(@PathVariable("domainCode") String domainCode, @PathVariable("dataSourceName") String dataSourceName) { + DataSourceVO dataSource = dataSourceService.queryByDataSourceName(domainCode, dataSourceName); return R.builderOk().data("result", dataSource == null).build(); } // ================================ Load Selectors ================================ diff --git a/rec-admin/rec-admin-web/src/main/java/cn/icanci/rec/admin/web/controller/config/StrategyController.java b/rec-admin/rec-admin-web/src/main/java/cn/icanci/rec/admin/web/controller/config/StrategyController.java new file mode 100644 index 0000000..fca8afd --- /dev/null +++ b/rec-admin/rec-admin-web/src/main/java/cn/icanci/rec/admin/web/controller/config/StrategyController.java @@ -0,0 +1,54 @@ +package cn.icanci.rec.admin.web.controller.config; + +import cn.icanci.rec.admin.biz.model.StrategyDebugResult; +import cn.icanci.rec.admin.biz.service.StrategyService; +import cn.icanci.rec.admin.web.form.StrategyDebugForm; +import cn.icanci.rec.admin.web.form.StrategyQueryForm; +import cn.icanci.rec.admin.web.mapper.StrategyWebMapper; +import cn.icanci.rec.admin.web.model.Strategy; +import cn.icanci.rec.common.model.config.StrategyVO; +import cn.icanci.rec.common.result.R; + +import javax.annotation.Resource; + +import org.springframework.web.bind.annotation.*; + +/** + * @author icanci + * @since 1.0 Created in 2022/11/18 22:08 + */ +@RestController +@RequestMapping("/rec/strategy") +public class StrategyController { + @Resource + private StrategyService strategyService; + @Resource + private StrategyWebMapper strategyWebMapper; + + // ================================ CRUD ================================ + @PostMapping("query") + public R query(@RequestBody StrategyQueryForm form) { + return R.builderOk() + .data("queryPage", strategyService.queryPage(strategyWebMapper.web2vo(form.getStrategy()), form.getPaginator().getCurrentPage(), form.getPaginator().getPageSize())) + .build(); + } + + @PostMapping("save") + public R save(@RequestBody Strategy strategy) { + strategyService.save(strategyWebMapper.web2vo(strategy)); + return R.builderOk().build(); + } + + @GetMapping("validateStrategyName/{domainCode}/{strategyName}") + public R validateStrategyName(@PathVariable("domainCode") String domainCode, @PathVariable("strategyName") String strategyName) { + StrategyVO strategy = strategyService.queryByStrategyName(domainCode, strategyName); + return R.builderOk().data("result", strategy == null).build(); + } + // ================================ Debug ================================ + + @PostMapping("debug") + public R debug(@RequestBody StrategyDebugForm strategyDebug) { + StrategyDebugResult result = strategyService.debug(strategyWebMapper.web2vo(strategyDebug.getStrategy()), strategyDebug.getScriptContentTest()); + return R.builderOk().data("result", result).build(); + } +} diff --git a/rec-admin/rec-admin-web/src/main/java/cn/icanci/rec/admin/web/form/StrategyDebugForm.java b/rec-admin/rec-admin-web/src/main/java/cn/icanci/rec/admin/web/form/StrategyDebugForm.java new file mode 100644 index 0000000..7f41c70 --- /dev/null +++ b/rec-admin/rec-admin-web/src/main/java/cn/icanci/rec/admin/web/form/StrategyDebugForm.java @@ -0,0 +1,33 @@ +package cn.icanci.rec.admin.web.form; + +import cn.icanci.rec.admin.web.model.Strategy; + +import java.io.Serializable; + +/** + * @author icanci + * @since 1.0 Created in 2022/11/18 22:09 + */ +public class StrategyDebugForm implements Serializable { + private static final long serialVersionUID = 7046936486304373642L; + + private Strategy strategy; + + private String scriptContentTest; + + public Strategy getStrategy() { + return strategy; + } + + public void setStrategy(Strategy strategy) { + this.strategy = strategy; + } + + public String getScriptContentTest() { + return scriptContentTest; + } + + public void setScriptContentTest(String scriptContentTest) { + this.scriptContentTest = scriptContentTest; + } +} diff --git a/rec-admin/rec-admin-web/src/main/java/cn/icanci/rec/admin/web/form/StrategyQueryForm.java b/rec-admin/rec-admin-web/src/main/java/cn/icanci/rec/admin/web/form/StrategyQueryForm.java new file mode 100644 index 0000000..34472d1 --- /dev/null +++ b/rec-admin/rec-admin-web/src/main/java/cn/icanci/rec/admin/web/form/StrategyQueryForm.java @@ -0,0 +1,20 @@ +package cn.icanci.rec.admin.web.form; + +import cn.icanci.rec.admin.web.model.Strategy; + +/** + * @author icanci + * @since 1.0 Created in 2022/11/18 22:08 + */ +public class StrategyQueryForm extends BaseQueryForm { + private static final long serialVersionUID = 6978323388657447739L; + private Strategy strategy; + + public Strategy getStrategy() { + return strategy; + } + + public void setStrategy(Strategy strategy) { + this.strategy = strategy; + } +} diff --git a/rec-admin/rec-admin-web/src/main/java/cn/icanci/rec/admin/web/mapper/LogOperateWebMapper.java b/rec-admin/rec-admin-web/src/main/java/cn/icanci/rec/admin/web/mapper/LogOperateWebMapper.java index 2685d0f..7ed5d76 100644 --- a/rec-admin/rec-admin-web/src/main/java/cn/icanci/rec/admin/web/mapper/LogOperateWebMapper.java +++ b/rec-admin/rec-admin-web/src/main/java/cn/icanci/rec/admin/web/mapper/LogOperateWebMapper.java @@ -4,7 +4,6 @@ import cn.icanci.rec.admin.web.model.LogOperate; import cn.icanci.rec.common.model.log.LogOperateVO; import java.util.Collection; -import java.util.Date; import java.util.List; import org.mapstruct.Mapper; @@ -23,7 +22,7 @@ public interface LogOperateWebMapper { logOperate.setTargetId(vo.getTargetId()); logOperate.setOperatorType(vo.getOperatorType().getDesc()); logOperate.setContent(vo.getContent()); - logOperate.setCreateTime(new Date()); + logOperate.setCreateTime(vo.getCreateTime()); logOperate.setEnv(logOperate.getEnv()); return logOperate; } diff --git a/rec-common/src/main/java/cn/icanci/rec/common/enums/ModuleTypeEnum.java b/rec-common/src/main/java/cn/icanci/rec/common/enums/ModuleTypeEnum.java index 6319ff2..ae9dbc9 100644 --- a/rec-common/src/main/java/cn/icanci/rec/common/enums/ModuleTypeEnum.java +++ b/rec-common/src/main/java/cn/icanci/rec/common/enums/ModuleTypeEnum.java @@ -24,6 +24,10 @@ public enum ModuleTypeEnum { * REC_DATA_SOURCE */ REC_DATA_SOURCE("REC_DATA_SOURCE", "规则数据源"), + /** + * REC_STRATEGY + */ + REC_STRATEGY("REC_STRATEGY", "规则策略"), ; diff --git a/rec-common/src/main/java/cn/icanci/rec/common/utils/FieldUtils.java b/rec-common/src/main/java/cn/icanci/rec/common/utils/FieldUtils.java new file mode 100644 index 0000000..43a134c --- /dev/null +++ b/rec-common/src/main/java/cn/icanci/rec/common/utils/FieldUtils.java @@ -0,0 +1,28 @@ +package cn.icanci.rec.common.utils; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * @author icanci + * @since 1.0 Created in 2022/11/18 23:26 + */ +public class FieldUtils { + /** + * 获取本类及其父类的字段属性 + * + * @param clazz 当前类对象 + * @return 字段数组 + */ + public static Field[] getAllFields(Class clazz) { + List fieldList = new ArrayList<>(); + while (clazz != null) { + fieldList.addAll(new ArrayList<>(Arrays.asList(clazz.getDeclaredFields()))); + clazz = clazz.getSuperclass(); + } + Field[] fields = new Field[fieldList.size()]; + return fieldList.toArray(fields); + } +} diff --git a/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/PropertiesUtil.java b/rec-common/src/main/java/cn/icanci/rec/common/utils/PropertiesUtil.java similarity index 97% rename from rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/PropertiesUtil.java rename to rec-common/src/main/java/cn/icanci/rec/common/utils/PropertiesUtil.java index ff1ecb1..7346974 100644 --- a/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/PropertiesUtil.java +++ b/rec-common/src/main/java/cn/icanci/rec/common/utils/PropertiesUtil.java @@ -1,4 +1,4 @@ -package cn.icanci.rec.engine.sdk.http; +package cn.icanci.rec.common.utils; import java.io.IOException; import java.io.InputStream; diff --git a/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/http/OkHttpClientImpl.java b/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/http/OkHttpClientImpl.java index 415604d..7f5df8b 100644 --- a/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/http/OkHttpClientImpl.java +++ b/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/http/OkHttpClientImpl.java @@ -116,7 +116,7 @@ public class OkHttpClientImpl extends AbstractRetryClient { */ protected String buildGetInfo(RpcRequest request) throws UnsupportedEncodingException { String url = request.getUrl(); - if (StringUtils.isBlank(request.getBody().toString())) { + if (request.getBody() == null || StringUtils.isBlank(request.getBody().toString())) { return url; } Map params = (Map) request.getBody(); @@ -154,7 +154,7 @@ public class OkHttpClientImpl extends AbstractRetryClient { private V doExecute(RpcRequest rpcRequest, Request request, Class clazz) throws IOException { OkHttpClient client = getClient(rpcRequest.getReadTimeOut(), rpcRequest.getTimeUnit()); Response response = client.newCall(request).execute(); - if (clazz != String.class || clazz != byte[].class) { + if (clazz != String.class && clazz != byte[].class) { String metaData = (String) CONVERTER_MAP.get(String.class).readInternal(response); SerializerEnum serializerEnum = rpcRequest.getRepSerializer(); return serializerEnum == null ? (V) metaData : serializerEnum.getSerializer().deserialize(metaData, clazz); diff --git a/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/AbstractLoadSPI.java b/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/AbstractLoadSPI.java index 6130ee1..a4b7202 100644 --- a/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/AbstractLoadSPI.java +++ b/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/AbstractLoadSPI.java @@ -1,10 +1,12 @@ package cn.icanci.rec.engine.sdk.http.spi; -import cn.icanci.rec.engine.sdk.http.PropertiesUtil; +import cn.icanci.rec.common.utils.PropertiesUtil; import java.util.Map; /** + * TODO 推拉模型,拉取配置时间,以秒为单位 PropertiesUtil 迁移到common测试 + * * @author icanci * @since 1.0 Created in 2022/11/15 21:35 */ diff --git a/rec-engine/rec-engine-sdk-netty/src/main/java/cn/icanci/rec/engine/sdk/netty/PropertiesUtil.java b/rec-engine/rec-engine-sdk-netty/src/main/java/cn/icanci/rec/engine/sdk/netty/PropertiesUtil.java deleted file mode 100644 index 1aff2af..0000000 --- a/rec-engine/rec-engine-sdk-netty/src/main/java/cn/icanci/rec/engine/sdk/netty/PropertiesUtil.java +++ /dev/null @@ -1,56 +0,0 @@ -package cn.icanci.rec.engine.sdk.netty; - -import java.io.IOException; -import java.io.InputStream; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; -import java.util.Properties; - -/** - * @author icanci - * @since 1.0 Created in 2022/11/15 21:38 - */ -public class PropertiesUtil { - /** - * The constant confProperties. - */ - private static Properties confProperties; - - /** - * 初始化 - * - * @param classLoader classLoader - * @param sourcePath sourcePath - */ - private static void init(ClassLoader classLoader, String sourcePath) { - if (confProperties == null) { - confProperties = new Properties(); - - try (InputStream in = classLoader.getResourceAsStream(sourcePath)) { - confProperties.load(in); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - - /** - * Get string. - * - * @param classLoader 类加载器 - * @return the string - */ - public static Map getPropertyMap(ClassLoader classLoader, String sourcePath) { - // 初始化加载 - init(classLoader, sourcePath); - - Map propertyMap = new HashMap<>(); - Iterator> iterator = confProperties.entrySet().iterator(); - while (iterator.hasNext()) { - Map.Entry next = iterator.next(); - propertyMap.put((String) next.getKey(), (String) next.getValue()); - } - return propertyMap; - } -} diff --git a/rec-engine/rec-engine-sdk-netty/src/main/java/cn/icanci/rec/engine/sdk/netty/spi/AbstractLoadSPI.java b/rec-engine/rec-engine-sdk-netty/src/main/java/cn/icanci/rec/engine/sdk/netty/spi/AbstractLoadSPI.java new file mode 100644 index 0000000..efb0ef1 --- /dev/null +++ b/rec-engine/rec-engine-sdk-netty/src/main/java/cn/icanci/rec/engine/sdk/netty/spi/AbstractLoadSPI.java @@ -0,0 +1,23 @@ +package cn.icanci.rec.engine.sdk.netty.spi; + +import cn.icanci.rec.common.utils.PropertiesUtil; + +import java.util.Map; + +/** + * @author icanci + * @since 1.0 Created in 2022/11/18 19:37 + */ +public class AbstractLoadSPI { + private static final String PROPERTIES_NAME = "rec-netty-spi-load.properties"; + + private static final String REQ_HTTP_PATH_PROP = "rec-http-request-url"; + + protected static final String REQ_HTTP_PATH; + + static { + // 加载数据 + Map propertyMap = PropertiesUtil.getPropertyMap(Thread.currentThread().getContextClassLoader(), PROPERTIES_NAME); + REQ_HTTP_PATH = propertyMap.get(REQ_HTTP_PATH_PROP); + } +} diff --git a/rec-engine/rec-engine-sdk-netty/src/main/java/cn/icanci/rec/engine/sdk/netty/spi/NettyBaseDataSPI.java b/rec-engine/rec-engine-sdk-netty/src/main/java/cn/icanci/rec/engine/sdk/netty/spi/NettyBaseDataSPI.java new file mode 100644 index 0000000..f91687a --- /dev/null +++ b/rec-engine/rec-engine-sdk-netty/src/main/java/cn/icanci/rec/engine/sdk/netty/spi/NettyBaseDataSPI.java @@ -0,0 +1,24 @@ +package cn.icanci.rec.engine.sdk.netty.spi; + +import cn.icanci.rec.common.aggregation.model.BaseDataDTO; +import cn.icanci.rec.engine.sdk.spi.BaseDataSPI; + +import java.util.List; +import java.util.Set; + +/** + * @author icanci + * @since 1.0 Created in 2022/11/18 19:37 + */ +public class NettyBaseDataSPI extends AbstractLoadSPI implements BaseDataSPI { + + @Override + public List load(Set domains) { + return null; + } + + @Override + public List load(String domain) { + return null; + } +} diff --git a/rec-engine/rec-engine-sdk-netty/src/main/java/cn/icanci/rec/engine/sdk/netty/spi/NettyDataSourceSPI.java b/rec-engine/rec-engine-sdk-netty/src/main/java/cn/icanci/rec/engine/sdk/netty/spi/NettyDataSourceSPI.java new file mode 100644 index 0000000..c1d47a0 --- /dev/null +++ b/rec-engine/rec-engine-sdk-netty/src/main/java/cn/icanci/rec/engine/sdk/netty/spi/NettyDataSourceSPI.java @@ -0,0 +1,23 @@ +package cn.icanci.rec.engine.sdk.netty.spi; + +import cn.icanci.rec.common.aggregation.model.DataSourceDTO; +import cn.icanci.rec.engine.sdk.spi.DataSourceSPI; + +import java.util.List; +import java.util.Set; + +/** + * @author icanci + * @since 1.0 Created in 2022/11/18 19:37 + */ +public class NettyDataSourceSPI extends AbstractLoadSPI implements DataSourceSPI { + @Override + public List load(Set domains) { + return null; + } + + @Override + public List load(String domain) { + return null; + } +} diff --git a/rec-engine/rec-engine-sdk-netty/src/main/java/cn/icanci/rec/engine/sdk/netty/spi/NettyDomainSPI.java b/rec-engine/rec-engine-sdk-netty/src/main/java/cn/icanci/rec/engine/sdk/netty/spi/NettyDomainSPI.java new file mode 100644 index 0000000..814b11d --- /dev/null +++ b/rec-engine/rec-engine-sdk-netty/src/main/java/cn/icanci/rec/engine/sdk/netty/spi/NettyDomainSPI.java @@ -0,0 +1,29 @@ +package cn.icanci.rec.engine.sdk.netty.spi; + +import cn.icanci.rec.common.aggregation.model.DomainDTO; +import cn.icanci.rec.engine.sdk.spi.DomainSPI; + +import java.util.List; +import java.util.Set; + +/** + * @author icanci + * @since 1.0 Created in 2022/11/18 19:37 + */ +public class NettyDomainSPI extends AbstractLoadSPI implements DomainSPI { + + @Override + public DomainDTO loadOne(String domain) { + return null; + } + + @Override + public List load(Set domains) { + return null; + } + + @Override + public List load(String domain) { + return null; + } +} diff --git a/rec-engine/rec-engine-sdk-netty/src/main/java/cn/icanci/rec/engine/sdk/netty/spi/NettyMetadataSPI.java b/rec-engine/rec-engine-sdk-netty/src/main/java/cn/icanci/rec/engine/sdk/netty/spi/NettyMetadataSPI.java new file mode 100644 index 0000000..019bc70 --- /dev/null +++ b/rec-engine/rec-engine-sdk-netty/src/main/java/cn/icanci/rec/engine/sdk/netty/spi/NettyMetadataSPI.java @@ -0,0 +1,23 @@ +package cn.icanci.rec.engine.sdk.netty.spi; + +import cn.icanci.rec.common.aggregation.model.MetadataDTO; +import cn.icanci.rec.engine.sdk.spi.MetadataSPI; + +import java.util.List; +import java.util.Set; + +/** + * @author icanci + * @since 1.0 Created in 2022/11/18 19:37 + */ +public class NettyMetadataSPI extends AbstractLoadSPI implements MetadataSPI { + @Override + public List load(Set domains) { + return null; + } + + @Override + public List load(String domain) { + return null; + } +} diff --git a/rec-engine/rec-engine-sdk-netty/src/main/java/cn/icanci/rec/engine/sdk/netty/spi/NettySceneSPI.java b/rec-engine/rec-engine-sdk-netty/src/main/java/cn/icanci/rec/engine/sdk/netty/spi/NettySceneSPI.java new file mode 100644 index 0000000..402583d --- /dev/null +++ b/rec-engine/rec-engine-sdk-netty/src/main/java/cn/icanci/rec/engine/sdk/netty/spi/NettySceneSPI.java @@ -0,0 +1,28 @@ +package cn.icanci.rec.engine.sdk.netty.spi; + +import cn.icanci.rec.common.aggregation.model.SceneDTO; +import cn.icanci.rec.engine.sdk.spi.SceneSPI; + +import java.util.List; +import java.util.Set; + +/** + * @author icanci + * @since 1.0 Created in 2022/11/18 19:37 + */ +public class NettySceneSPI extends AbstractLoadSPI implements SceneSPI { + @Override + public List load(Set domains) { + return null; + } + + @Override + public List load(String domain) { + return null; + } + + @Override + public SceneDTO loadOne(String domainCode) { + return null; + } +} diff --git a/rec-engine/rec-engine-sdk-netty/src/main/java/cn/icanci/rec/engine/sdk/netty/spi/NettyStrategySPI.java b/rec-engine/rec-engine-sdk-netty/src/main/java/cn/icanci/rec/engine/sdk/netty/spi/NettyStrategySPI.java new file mode 100644 index 0000000..c117923 --- /dev/null +++ b/rec-engine/rec-engine-sdk-netty/src/main/java/cn/icanci/rec/engine/sdk/netty/spi/NettyStrategySPI.java @@ -0,0 +1,24 @@ +package cn.icanci.rec.engine.sdk.netty.spi; + +import cn.icanci.rec.common.aggregation.model.StrategyDTO; +import cn.icanci.rec.engine.sdk.spi.StrategySPI; + +import java.util.List; +import java.util.Set; + +/** + * @author icanci + * @since 1.0 Created in 2022/11/18 19:37 + */ +public class NettyStrategySPI extends AbstractLoadSPI implements StrategySPI { + @Override + public List load(Set domains) { + return null; + } + + @Override + public List load(String domain) { + return null; + } + +} diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/RecEngineSDKAutoConfig.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/RecEngineSDKAutoConfig.java index 425eebf..77c37f0 100644 --- a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/RecEngineSDKAutoConfig.java +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/RecEngineSDKAutoConfig.java @@ -1,11 +1,13 @@ package cn.icanci.rec.engine.sdk; +import cn.icanci.rec.common.utils.FieldUtils; import cn.icanci.rec.engine.script.RecScriptEngine; import cn.icanci.rec.engine.script.RecScriptEngineManager; import cn.icanci.rec.engine.sdk.actuator.RecRuleEngineActuator; import cn.icanci.rec.engine.sdk.actuator.impl.RecRuleEngineActuatorImpl; -import cn.icanci.rec.engine.sdk.condition.ConditionSupport; +import cn.icanci.rec.engine.sdk.exception.InjectionBeanException; import cn.icanci.rec.engine.sdk.extensions.RecExtensionLoader; +import cn.icanci.rec.engine.sdk.extensions.SpringBean; import cn.icanci.rec.engine.sdk.rule.EngineExecutor; import cn.icanci.rec.engine.sdk.rule.EngineRepositoryLoader; import cn.icanci.rec.engine.sdk.rule.impl.EngineRepositoryLoaderImpl; @@ -13,6 +15,9 @@ import cn.icanci.rec.engine.sdk.rule.pool.ScriptExecutorPoolHolder; import cn.icanci.rec.engine.sdk.rule.repository.EngineRepositoryHolder; import cn.icanci.rec.engine.sdk.spi.*; +import java.lang.reflect.Field; +import java.util.Set; + import org.springframework.beans.BeansException; import org.springframework.boot.CommandLineRunner; import org.springframework.context.ApplicationContext; @@ -20,6 +25,8 @@ import org.springframework.context.ApplicationContextAware; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import com.google.common.collect.Sets; + /** * @author icanci * @since 1.0 Created in 2022/11/15 20:34 @@ -117,7 +124,9 @@ public class RecEngineSDKAutoConfig implements ApplicationContextAware, CommandL */ @Bean("domainSPI") public DomainSPI domainSPI() { - return RecExtensionLoader.getExtensionLoader(DomainSPI.class).getExtension(); + DomainSPI extension = RecExtensionLoader.getExtensionLoader(DomainSPI.class).getExtension(); + injectionSpringBeanProcessor(extension); + return extension; } /** @@ -127,7 +136,9 @@ public class RecEngineSDKAutoConfig implements ApplicationContextAware, CommandL */ @Bean("baseDataSPI") public BaseDataSPI baseDataSPI() { - return RecExtensionLoader.getExtensionLoader(BaseDataSPI.class).getExtension(); + BaseDataSPI extension = RecExtensionLoader.getExtensionLoader(BaseDataSPI.class).getExtension(); + injectionSpringBeanProcessor(extension); + return extension; } /** @@ -137,7 +148,9 @@ public class RecEngineSDKAutoConfig implements ApplicationContextAware, CommandL */ @Bean("dataSourceSPI") public DataSourceSPI dataSourceSPI() { - return RecExtensionLoader.getExtensionLoader(DataSourceSPI.class).getExtension(); + DataSourceSPI extension = RecExtensionLoader.getExtensionLoader(DataSourceSPI.class).getExtension(); + injectionSpringBeanProcessor(extension); + return extension; } /** @@ -147,7 +160,9 @@ public class RecEngineSDKAutoConfig implements ApplicationContextAware, CommandL */ @Bean("metadataSPI") public MetadataSPI metadataSPI() { - return RecExtensionLoader.getExtensionLoader(MetadataSPI.class).getExtension(); + MetadataSPI extension = RecExtensionLoader.getExtensionLoader(MetadataSPI.class).getExtension(); + injectionSpringBeanProcessor(extension); + return extension; } /** @@ -157,7 +172,9 @@ public class RecEngineSDKAutoConfig implements ApplicationContextAware, CommandL */ @Bean("sceneSPI") public SceneSPI sceneSPI() { - return RecExtensionLoader.getExtensionLoader(SceneSPI.class).getExtension(); + SceneSPI extension = RecExtensionLoader.getExtensionLoader(SceneSPI.class).getExtension(); + injectionSpringBeanProcessor(extension); + return extension; } /** @@ -167,7 +184,53 @@ public class RecEngineSDKAutoConfig implements ApplicationContextAware, CommandL */ @Bean("strategySPI") public StrategySPI strategySPI() { - return RecExtensionLoader.getExtensionLoader(StrategySPI.class).getExtension(); + StrategySPI extension = RecExtensionLoader.getExtensionLoader(StrategySPI.class).getExtension(); + injectionSpringBeanProcessor(extension); + return extension; + } + + /** + * 后置注入Bean + * + * @param spi spi + */ + public void injectionSpringBeanProcessor(RecSupportSPI spi) { + SpringBean annotation = spi.getClass().getAnnotation(SpringBean.class); + if (annotation == null) { + return; + } + Class[] value = annotation.value(); + Set> classes = Sets.newHashSet(value); + for (Class clazz : classes) { + injection(spi, clazz); + } + } + + /** + * 为SPI注入Bean + * + * @param spi spi + * @param clazz clazz + */ + private void injection(RecSupportSPI spi, Class clazz) { + try { + Object bean = context.getBean(clazz); + // 为spi注入 + Field[] fields = FieldUtils.getAllFields(spi.getClass()); + for (Field field : fields) { + if (field.getType() != clazz) { + continue; + } + + field.setAccessible(true); + + if (field.get(spi) == null) { + field.set(spi, bean); + } + } + } catch (Exception e) { + throw new InjectionBeanException(e); + } } /** diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/exception/InjectionBeanException.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/exception/InjectionBeanException.java new file mode 100644 index 0000000..804ecd0 --- /dev/null +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/exception/InjectionBeanException.java @@ -0,0 +1,29 @@ +package cn.icanci.rec.engine.sdk.exception; + +/** + * @author icanci + * @since 1.0 Created in 2022/11/18 23:15 + */ +public class InjectionBeanException extends RuntimeException{ + private static final long serialVersionUID = 1755052174893509949L; + + public InjectionBeanException() { + super(); + } + + public InjectionBeanException(String message) { + super(message); + } + + public InjectionBeanException(String message, Throwable cause) { + super(message, cause); + } + + public InjectionBeanException(Throwable cause) { + super(cause); + } + + protected InjectionBeanException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } +} diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/extensions/RecSpi.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/extensions/RecSpi.java index 97f8dd2..5f0b04e 100644 --- a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/extensions/RecSpi.java +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/extensions/RecSpi.java @@ -6,6 +6,8 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** + * 规则引擎执行SPi标记 + * * @author icanci * @since 1.0 Created in 2022/11/15 21:16 */ diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/extensions/SpringBean.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/extensions/SpringBean.java new file mode 100644 index 0000000..5c3a0e7 --- /dev/null +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/extensions/SpringBean.java @@ -0,0 +1,21 @@ +package cn.icanci.rec.engine.sdk.extensions; + +import java.lang.annotation.*; + +/** + * SPI的实现类中某些字段是否需要从Spring容器注入 + * + * @author icanci + * @since 1.0 Created in 2022/11/18 22:42 + */ +@Inherited +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +public @interface SpringBean { + /** + * 需要被注入的bean的Class + * + * @return 返回需要被注入的Bean的Class + */ + Class[] value(); +} diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/EngineExecutor.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/EngineExecutor.java index 22e2747..f769892 100644 --- a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/EngineExecutor.java +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/EngineExecutor.java @@ -120,7 +120,7 @@ public final class EngineExecutor { // condition1 和 condition2 是或的关系 // condition1 中 sc1.1 和 sc1.2 是且的关系 // condition2 中 sc2.1、sc2.2、sc2.3 是且的关系 - // 如果没一组的最后一个cell具备孩子节点,则继续执行孩子节点 + // 如果每一组的最后一个cell具备孩子节点,则继续执行孩子节点 // 判断执行模式,简单还是复杂 List conditions = ruleListInfo.getConditions(); -- Gitee